Remove dead formats: alan, an1, netstumbler, naviguide.
authorRobert Lipe <robertlipe@gmail.com>
Thu, 14 Jan 2021 07:01:24 +0000 (01:01 -0600)
committerRobert Lipe <robertlipe@gmail.com>
Thu, 14 Jan 2021 07:01:24 +0000 (01:01 -0600)
As discussed in https://github.com/gpsbabel/gpsbabel/issues/659

50 files changed:
CMakeLists.txt
GPSBabel.pro
alan.cc [deleted file]
an1.cc [deleted file]
an1sym.h [deleted file]
deprecated/alan.cc [new file with mode: 0644]
deprecated/an1.cc [new file with mode: 0644]
deprecated/an1sym.h [new file with mode: 0644]
deprecated/netstumbler.cc [new file with mode: 0644]
intdoc/SA2003_an1_dump.pl [deleted file]
intdoc/an1_road_types.txt [deleted file]
naviguide.cc [deleted file]
netstumbler.cc [deleted file]
reference/alantrl.gpx [deleted file]
reference/alantrl.trl [deleted file]
reference/alanwpr.gpx [deleted file]
reference/alanwpr.wpr [deleted file]
reference/an1-an1.ref [deleted file]
reference/an1-in.ref [deleted file]
reference/an1-line-out.ref [deleted file]
reference/an1-out.ref [deleted file]
reference/foo.an1 [deleted file]
reference/format0.txt
reference/format1.txt
reference/format2.txt
reference/format3.txt
reference/help.txt
reference/ics.gpx.naviguide.gpx [deleted file]
reference/route/naviguide-route.twl [deleted file]
reference/route/naviguide.gpx [deleted file]
testo.d/alantrl.test [deleted file]
testo.d/alanwpr.test [deleted file]
testo.d/an1.test [deleted file]
testo.d/naviguide.test [deleted file]
testo.d/netstumbler.test [deleted file]
vecs.h
xmldoc/formats/alantrl.xml [deleted file]
xmldoc/formats/alanwpr.xml [deleted file]
xmldoc/formats/an1.xml [deleted file]
xmldoc/formats/naviguide.xml [deleted file]
xmldoc/formats/options/an1-color.xml [deleted file]
xmldoc/formats/options/an1-deficon.xml [deleted file]
xmldoc/formats/options/an1-nogc.xml [deleted file]
xmldoc/formats/options/an1-nourl.xml [deleted file]
xmldoc/formats/options/an1-radius.xml [deleted file]
xmldoc/formats/options/an1-road.xml [deleted file]
xmldoc/formats/options/an1-type.xml [deleted file]
xmldoc/formats/options/an1-wpt_type.xml [deleted file]
xmldoc/formats/options/an1-zoom.xml [deleted file]
xmldoc/formats/options/naviguide-reorder.xml [deleted file]

index 2b2ec2c6c41762b5b6156ca61dbdaf98ba42b939..f45a08e696f3c3fa91a5a0d9583e42c9e02baf80 100644 (file)
@@ -38,18 +38,18 @@ set(ALL_FMTS
   skytraq.cc holux.cc tmpro.cc tpg.cc tpo.cc
   xcsv.cc tiger.cc easygps.cc
   saroute.cc navicache.cc delgpl.cc
-  ozi.cc text.cc html.cc netstumbler.cc
+  ozi.cc text.cc html.cc
   igc.cc brauniger_iq.cc shape.cc hiketech.cc glogbook.cc
-  vcf.cc lowranceusr.cc an1.cc tomtom.cc
+  vcf.cc lowranceusr.cc tomtom.cc
   tef_xml.cc maggeo.cc vitosmt.cc gdb.cc bcr.cc
   ignrando.cc stmwpp.cc cst.cc nmn4.cc compegps.cc
   yahoo.cc unicsv.cc wfff_xml.cc garmin_txt.cc gpssim.cc
-  stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc alan.cc vitovtt.cc
+  stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc vitovtt.cc
   ggv_log.cc g7towin.cc garmin_gpi.cc lmx.cc random.cc xol.cc dg-100.cc
   navilink.cc mtk_logger.cc ik3d.cc osm.cc destinator.cc exif.cc vidaone.cc
   igo8.cc gopal.cc humminbird.cc mapasia.cc gnav_trl.cc navitel.cc ggv_ovl.cc
   jtr.cc sbp.cc sbn.cc mmo.cc skyforce.cc itracku.cc v900.cc
-  pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc naviguide.cc enigma.cc
+  pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc enigma.cc
   vpl.cc teletype.cc jogmap.cc bushnell.cc bushnell_trl.cc wintec_tes.cc
   subrip.cc garmin_xt.cc garmin_fit.cc
   mtk_locus.cc googledir.cc mapbar_track.cc mapfactor.cc f90g_track.cc
@@ -102,7 +102,6 @@ set(SUPPORT
 )
 
 set(HEADERS
-  an1sym.h
   cet.h
   cet_util.h
   csv_util.h
index 5ca3d54dc7864c5b1a02e49ede2011e80c46b146..cf6626bfdc63d4fdb47e24fbe9ec863f12ccee81 100644 (file)
@@ -62,18 +62,18 @@ ALL_FMTS=$$MINIMAL_FMTS gtm.cc gpsutil.cc pcx.cc \
         skytraq.cc holux.cc tmpro.cc tpg.cc tpo.cc \
         xcsv.cc tiger.cc easygps.cc \
         saroute.cc navicache.cc delgpl.cc \
-        ozi.cc text.cc html.cc netstumbler.cc \
+        ozi.cc text.cc html.cc \
         igc.cc brauniger_iq.cc shape.cc hiketech.cc glogbook.cc \
-        vcf.cc lowranceusr.cc an1.cc tomtom.cc \
+        vcf.cc lowranceusr.cc tomtom.cc \
         tef_xml.cc maggeo.cc vitosmt.cc gdb.cc bcr.cc \
         ignrando.cc stmwpp.cc cst.cc nmn4.cc compegps.cc \
         yahoo.cc unicsv.cc wfff_xml.cc garmin_txt.cc gpssim.cc \
-        stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc alan.cc vitovtt.cc \
+        stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc vitovtt.cc \
         ggv_log.cc g7towin.cc garmin_gpi.cc lmx.cc random.cc xol.cc dg-100.cc \
         navilink.cc mtk_logger.cc ik3d.cc osm.cc destinator.cc exif.cc vidaone.cc \
         igo8.cc gopal.cc humminbird.cc mapasia.cc gnav_trl.cc navitel.cc ggv_ovl.cc \
         jtr.cc sbp.cc sbn.cc mmo.cc skyforce.cc itracku.cc v900.cc \
-        pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc naviguide.cc enigma.cc \
+        pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc enigma.cc \
         vpl.cc teletype.cc jogmap.cc bushnell.cc bushnell_trl.cc wintec_tes.cc \
         subrip.cc garmin_xt.cc garmin_fit.cc \
         mtk_locus.cc googledir.cc mapbar_track.cc mapfactor.cc f90g_track.cc \
@@ -111,7 +111,6 @@ SUPPORT = route.cc waypt.cc filter_vecs.cc util.cc vecs.cc mkshort.cc \
           src/core/xmlstreamwriter.cc
 
 HEADERS =  \
-       an1sym.h \
        cet.h \
        cet_util.h \
        csv_util.h \
diff --git a/alan.cc b/alan.cc
deleted file mode 100644 (file)
index 5efe64d..0000000
--- a/alan.cc
+++ /dev/null
@@ -1,994 +0,0 @@
-/*
-
-    Read/write Alan Map500 Waypoints, Routes and Tracklogs.
-
-    Provides "alanwpr" and "alantrl" formats for gpsbabel.
-    Currently supports OS 2.xx only.
-
-    Copyright (C) 2007  Gunar Megger, 0xff@quantentunnel.de
-    Copyright (C) 2002-2014 Robert Lipe, robertlipe+source@gpsbabel.org
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
- */
-
-#include <cctype>                  // for isprint
-#include <cstdio>                  // for snprintf, sprintf, SEEK_SET, size_t
-#include <cstdint>                 // for int16_t, int32_t, uint8_t, uint32_t, uint16_t, int8_t
-#include <cstring>                 // for memset, strlen, strncpy, memcpy, strncmp
-#include <ctime>                   // for gmtime, time, time_t
-
-#include <QtCore/QString>          // for QString
-#include <QtCore/QVector>          // for QVector
-
-#include "defs.h"
-#include "gbfile.h"                // for gbfwrite, gbfile, gbfread, gbfclose, gbfopen, gbfseek
-#include "src/core/datetime.h"     // for DateTime
-
-#define MYNAME "alan"
-
-#define MAXWPT      1000               /* old 500 */
-
-#define MAXRTE      50                 /* old 20 */
-#define MAXWPTINRTE 150                        /* old 30 */
-
-#define MAXTRK      8                  /* old 5 */
-#define MAXPTINTRK  2500
-
-#define WPT_NAME_LEN    8
-#define WPT_COMMENT_LEN 12
-
-#define RTE_NAME_LEN    8
-#define RTE_COMMENT_LEN 12
-
-#define TRK_NAME_LEN    12
-#define TRK_COMMENT_LEN 13
-
-struct wpthdr {
-  uint32_t id;
-  int16_t num;
-  int16_t next;
-  int16_t idx[MAXWPT];
-  uint8_t used[MAXWPT];
-};
-
-struct wpt {
-  char name[WPT_NAME_LEN];
-  char comment[WPT_COMMENT_LEN];
-  struct {
-    int32_t x;                         /* degree * 36000 */
-    int32_t y;                         /* degree * 36000  */
-  } pt;
-  int32_t date;
-  int32_t time;
-  int16_t usecount;
-  int8_t checked;
-  int8_t reserved;
-};
-
-struct rtehdr {
-  uint32_t id;
-  int16_t num;
-  int16_t next;
-  int16_t idx[MAXRTE];
-  uint8_t used[MAXRTE];
-  int16_t rteno;
-};
-
-struct rte {
-  char name[RTE_NAME_LEN];
-  char comment[RTE_COMMENT_LEN];
-  int16_t wptnum;
-  int16_t wptidx[MAXWPTINRTE];
-  int16_t reserved;
-  int32_t date;
-  int32_t time;
-};
-
-struct wprdata {
-  struct wpthdr wpthdr;
-  struct wpt    wpt[MAXWPT];
-  struct rtehdr rtehdr;
-  struct rte    rte[MAXRTE];
-};
-
-struct trkhdr {
-  int16_t totalpt;
-  int16_t next;
-  char name[TRK_NAME_LEN];             /* 10, null terminated */
-  char comment[TRK_COMMENT_LEN];       /* 12, null terminated */
-  uint8_t reserved[3];
-  uint32_t occupied;
-  uint32_t show;
-  uint32_t fill;
-};
-
-struct loghdr {
-  uint32_t id;
-  int16_t num;
-  int16_t next;
-  int32_t date;
-  int32_t time;
-  struct trkhdr trkhdr[MAXTRK];
-};
-
-struct trklog {
-  struct {
-    int32_t x;                         /* degree * 36000 */
-    int32_t y;                         /* degree * 36000  */
-  } pt[MAXPTINTRK];
-  struct {
-    int16_t speed;                     /* km/h * 200 */
-    int16_t height;                    /* m * 5 */
-  } sh[MAXPTINTRK];
-};
-
-struct trldata {
-  struct loghdr loghdr;
-  struct trklog trklog[MAXTRK];
-};
-
-#define WPT_HDR_ID 0x5C38A600
-#define RTE_HDR_ID 0xD87F5900
-#define TRL_HDR_ID 0x38CB1200
-
-#define WPT_IDX_NONE -1                        /* 0xffff */
-#define WPT_USED      0xff
-#define WPT_UNUSED    0
-#define WPT_CHECKED   1
-#define WPT_UNCHECKED 0
-
-#define RTE_IDX_NONE   -1              /* 0xffff */
-#define RTE_USED        0xff
-#define RTE_UNUSED      0
-#define RTE_RTENO_NONE -1
-
-#define TRK_USED     1
-#define TRK_UNUSED   0
-#define TRK_SHOW     1
-#define TRK_HIDE     0
-#define TRK_FILL     1
-#define TRK_WRAP     0
-
-#define MAP500_PT_SCALE 36000.0
-#define pt2deg(P) ((double)(P) / MAP500_PT_SCALE)
-#define deg2pt(D) (int32_t)si_round((double)(D) * MAP500_PT_SCALE)
-
-#define MAP500_ALTITUDE_SCALE   5.0
-#define hgt2m(A) ((double)(A) / MAP500_ALTITUDE_SCALE)
-#define m2hgt(A) (int16_t)si_round((double)(A) * MAP500_ALTITUDE_SCALE)
-
-#define MAP500_SPEED_SCALE    720.0
-#define sp2mps(S) ((double)(S) / MAP500_SPEED_SCALE)
-#define mps2sp(S) (int16_t)si_round((double)(S) * MAP500_SPEED_SCALE)
-
-#define  BYTEORDER_TEST  0x04030201    /* 32bit reference value */
-enum {
-  SWAP_NONE  = 0x1234,                 /* map500 regular */
-  SWAP_BYTES = 0x2143,                 /* bytes swapped */
-  SWAP_WORDS = 0x3412,                 /* words swapped */
-  SWAP_BOTH  = 0x4321                  /* words + bytes swapped */
-};
-
-/**************************************************************************/
-
-static gbfile* fin = nullptr, *fout = nullptr;
-static struct wprdata WPR;
-static struct trldata TRL;
-
-static QVector<arglist_t> wpr_args = {
-  /*
-  {"os3", &osversion, "Operating system version 3",
-          NULL, ARGTYPE_BOOL, ARGNOMINMAX },
-  */
-};
-static QVector<arglist_t> trl_args = {
-  /*
-  {"os3", &osversion, "Operating system version 3",
-          NULL, ARGTYPE_BOOL, ARGNOMINMAX },
-  */
-};
-
-/**************************************************************************/
-// FIXME: Why is this code doing its own byte order conversion?
-static unsigned int byte_order()
-{
-  // avoid cppcheck error: The address of local variable 'test' is accessed at non-zero index.
-  // avoid undefined behavior accessing inactive union member.
-  // avoid  "strict aliasing" warnings.
-  // see https://en.cppreference.com/w/cpp/language/reinterpret_cast#Notes
-  uint32_t test = BYTEORDER_TEST;
-  unsigned char ptr[4];
-
-  static_assert(sizeof ptr == sizeof test, "byte order test construction failure.");
-  memcpy(&ptr[0], &test, sizeof test);
-
-  unsigned int order = (ptr[0] << 12) | (ptr[1] << 8) | (ptr[2] << 4) | ptr[3];
-
-  return order;
-}
-
-static void sw_bytes(void* word)
-{
-  auto* p = (uint8_t*) word;
-  auto* r = (uint16_t*) word;
-
-  *r = (uint16_t)(p[1] << 8 | p[0]);
-}
-static void sw_words(void* dword)
-{
-  auto* p = (uint16_t*) dword;
-  auto* r = (uint32_t*) dword;
-
-  *r = (uint32_t)(p[0] << 16 | p[1]);
-}
-static void rev_bytes(void* dword)
-{
-  auto* p = (uint8_t*) dword;
-  auto* r = (uint32_t*) dword;
-
-  *r = (uint32_t)(p[3] << 24 | p[2] << 16 | p[1] << 8 | p[0]);
-}
-
-static void swap_wpthdr(struct wpthdr* wpthdr,
-                        void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
-  if (swap32_func != nullptr) {
-    swap32_func(&wpthdr->id);
-  }
-  if (swap16_func != nullptr) {
-    swap16_func(&wpthdr->num);
-    swap16_func(&wpthdr->next);
-    for (short &i : wpthdr->idx) {
-      swap16_func(&i);
-    }
-  }
-}
-
-static void swap_wpt(struct wpt* wpt,
-                     void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
-  if (swap16_func != nullptr) {
-    swap16_func(&wpt->usecount);
-  }
-  if (swap32_func != nullptr) {
-    swap32_func(&wpt->pt.x);
-    swap32_func(&wpt->pt.y);
-    swap32_func(&wpt->date);
-    swap32_func(&wpt->time);
-  }
-}
-
-static void swap_rtehdr(struct rtehdr* rtehdr,
-                        void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
-  if (swap16_func != nullptr) {
-    swap16_func(&rtehdr->num);
-    swap16_func(&rtehdr->next);
-    for (short &i : rtehdr->idx) {
-      swap16_func(&i);
-    }
-    swap16_func(&rtehdr->rteno);
-  }
-  if (swap32_func != nullptr) {
-    swap32_func(&rtehdr->id);
-  }
-}
-
-static void swap_rte(struct rte* rte,
-                     void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
-  if (swap16_func != nullptr) {
-    swap16_func(&rte->wptnum);
-    for (short &i : rte->wptidx) {
-      swap16_func(&i);
-    }
-    swap16_func(&rte->reserved);
-  }
-  if (swap32_func != nullptr) {
-    swap32_func(&rte->date);
-    swap32_func(&rte->time);
-  }
-}
-
-static void wpr_swap(struct wprdata* wprdata)
-{
-  void (*swap16_func)(void*);
-  void (*swap32_func)(void*);
-  int i;
-
-  switch (byte_order()) {
-  case SWAP_NONE:                 /* same byte oder, LITTLE_ENDIAN */
-    return;
-    break;
-  case SWAP_BOTH:                 /* swap words and bytes, BIG_ENDIAN */
-    swap16_func = sw_bytes;
-    swap32_func = rev_bytes;
-    break;
-  case SWAP_WORDS:                /* swap words, PDP_ENDIAN */
-    swap16_func = nullptr;
-    swap32_func = sw_words;
-    break;
-  case SWAP_BYTES:                /* swap bytes */
-    swap16_func = sw_bytes;
-    swap32_func = nullptr;
-    break;
-  default:
-    return;                       /* never reached */
-  }
-
-  swap_wpthdr(&(wprdata->wpthdr), swap16_func, swap32_func);
-  for (i=0; i< MAXWPT; i++) {
-    swap_wpt(&(wprdata->wpt[i]), swap16_func, swap32_func);
-  }
-  swap_rtehdr(&(wprdata->rtehdr), swap16_func, swap32_func);
-  for (i=0; i<MAXRTE; i++) {
-    swap_rte(&(wprdata->rte[i]), swap16_func, swap32_func);
-  }
-}
-
-static void swap_trkhdr(struct trkhdr* trkhdr,
-                        void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
-  if (swap16_func != nullptr) {
-    swap16_func(&(trkhdr->totalpt));
-    swap16_func(&(trkhdr->next));
-  }
-  if (swap32_func != nullptr) {
-    swap32_func(&(trkhdr->occupied));
-    swap32_func(&(trkhdr->show));
-    swap32_func(&(trkhdr->fill));
-  }
-}
-
-static void swap_loghdr(struct loghdr* loghdr,
-                        void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
-  if (swap16_func != nullptr) {
-    swap16_func(&(loghdr->num));
-    swap16_func(&(loghdr->next));
-  }
-  if (swap32_func != nullptr) {
-    swap32_func(&(loghdr->id));
-    swap32_func(&(loghdr->date));
-    swap32_func(&(loghdr->time));
-  }
-  for (auto &i : loghdr->trkhdr) {
-    swap_trkhdr(&i, swap16_func, swap32_func);
-  }
-}
-
-static void swap_trklog(struct trklog* trklog,
-                        void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
-  int i;
-
-  if (swap16_func != nullptr) {
-    for (i=0; i<MAXPTINTRK; i++) {
-      swap16_func(&(trklog->sh[i].speed));
-      swap16_func(&(trklog->sh[i].height));
-    }
-  }
-  if (swap32_func != nullptr) {
-    for (i=0; i<MAXPTINTRK; i++) {
-      swap32_func(&(trklog->pt[i].x));
-      swap32_func(&(trklog->pt[i].y));
-    }
-  }
-}
-
-static void trl_swap(struct trldata* trldata)
-{
-  void (*swap16_func)(void*);
-  void (*swap32_func)(void*);
-
-  switch (byte_order()) {
-  case SWAP_NONE:                 /* same byte oder, LITTLE_ENDIAN */
-    return;
-    break;
-  case SWAP_BOTH:                 /* swap words and bytes, BIG_ENDIAN */
-    swap16_func = sw_bytes;
-    swap32_func = rev_bytes;
-    break;
-  case SWAP_WORDS:                /* swap words, PDP_ENDIAN */
-    swap16_func = nullptr;
-    swap32_func = sw_words;
-    break;
-  case SWAP_BYTES:                /* swap bytes */
-    swap16_func = sw_bytes;
-    swap32_func = nullptr;
-    break;
-  default:
-    return;                        /* never reached */
-  }
-
-  swap_loghdr(&(trldata->loghdr), swap16_func, swap32_func);
-  for (auto &i : trldata->trklog) {
-    swap_trklog(&i, swap16_func, swap32_func);
-  }
-}
-
-
-/**************************************************************************/
-
-static void str2lab(char* dest, const char* src, int len, const char* fmt,
-                    int n)
-{
-  int j = 0;
-  if (src != nullptr) {
-    for (int i=0; i<len && src[i] != '\0'; i++) {
-      if (isprint(src[i])) {
-        dest[j++] = src[i];
-      }
-    }
-  }
-  if (j == 0 && fmt != nullptr) {
-    snprintf(dest, len, fmt, n);
-    j = strlen(dest);
-  }
-  if (j < len) {
-    memset(dest+j, ' ', len-j);
-  }
-}
-
-static void str2lab(char* dest, const QString& src, int len, const char* fmt,
-                    int n)
-{
-  str2lab(dest, CSTR(src), len, fmt, n);
-}
-
-static void pack_time(time_t t, int32_t* date, int32_t* time)
-{
-  struct tm* tm = gmtime(&t);
-  *date = tm->tm_mday | ((tm->tm_mon+1)<<8) | ((tm->tm_year+1900)<<16);
-  *time = t % 86400;
-}
-
-static time_t unpack_time(int32_t date, int32_t time)
-{
-  static int m_to_d[12] =
-  {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
-
-  short year = (date >> 16) & 0xffff;
-  short month = (date >> 8) & 0xff;    /* 1-12 */
-  short day = date & 0xff;          /* 1-31 */
-
-  month -= 1;                  /* fit struct tm */
-  year += month / 12;
-
-  if (month < 0) {
-    year -= 1;
-    month += 12;
-  }
-  time_t result = (year - 1970) * 365 + m_to_d[month];
-  if (month <= 1) {
-    year -= 1;
-  }
-  result += (year - 1968) / 4;
-  result -= (year - 1900) / 100;
-  result += (year - 1600) / 400;
-  result += day;
-  result -= 1;
-  result *= 86400;
-  result += time;           /* map500 time is inseconds of the day */
-
-  return result;
-}
-
-/**************************************************************************/
-
-static Waypoint* get_wpt(struct wprdata* wprdata, unsigned n)
-{
-  int j;
-
-  struct wpthdr* wpthdr = &(wprdata->wpthdr);
-  int idx = wpthdr->idx[n];
-
-  if (idx == WPT_IDX_NONE || wpthdr->used[idx] == WPT_UNUSED) {
-    return nullptr;
-  }
-  struct wpt* wpt = &(wprdata->wpt[idx]);
-
-  auto* WP = new Waypoint;
-  WP->latitude  = -pt2deg(wpt->pt.y);
-  WP->longitude =  pt2deg(wpt->pt.x);
-  WP->SetCreationTime(unpack_time(wpt->date, wpt->time));
-  for (j=WPT_NAME_LEN-1; j >= 0 && wpt->name[j] == ' '; j--) {}
-  char *s = xstrndup(wpt->name,j+1);
-  WP->shortname = s;
-  xfree(s);
-  for (j=WPT_COMMENT_LEN-1; j >= 0 && wpt->comment[j] == ' '; j--) {}
-  if (j >= 0) {
-    char *descr = xstrndup(wpt->comment, j+1);
-    WP->description = descr;
-    xfree(descr);
-  } else {
-    WP->description = "";
-  }
-  WP->notes = "";
-
-  return WP;
-}
-
-static void wpr_read()
-{
-  struct wprdata wprdata;
-  int i, j;
-  Waypoint* WP;
-
-  if (gbfread(&wprdata, sizeof(struct wprdata), 1, fin) != 1) {
-    fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file\n", fin->name);
-  }
-  wpr_swap(&wprdata);
-  if (wprdata.wpthdr.id != WPT_HDR_ID ||
-      wprdata.rtehdr.id != RTE_HDR_ID) {
-    fatal(MYNAME ": %s is not in Alan .wpr format.\n", fin->name);
-  }
-
-  /* waypoints */
-  for (i=0; i<MAXWPT; i++) {
-    WP = get_wpt(&wprdata, i);
-    if (WP != nullptr) {
-      waypt_add(WP);
-    }
-  }
-
-  /* routes */
-  struct rtehdr* rtehdr = &(wprdata.rtehdr);
-  for (i=0; i<MAXRTE; i++) {
-    int idx = rtehdr->idx[i];
-    if (idx == RTE_IDX_NONE || rtehdr->used[idx] == RTE_UNUSED) {
-      continue;
-    }
-    struct rte* rte = &(wprdata.rte[idx]);
-
-    auto* RT = new route_head;
-    RT->rte_num = i;
-    for (j=RTE_NAME_LEN-1; j >= 0 && rte->name[j] == ' '; j--) {}
-    char *s = xstrndup(rte->name,j+1);
-    RT->rte_name = s;
-    xfree(s);
-    for (j=RTE_COMMENT_LEN-1; j >= 0 && rte->comment[j] == ' '; j--) {}
-    if (j >= 0) {
-      char *desc = xstrndup(rte->comment,j+1);
-      RT->rte_desc = desc;
-      xfree(desc);
-    } else {
-      RT->rte_desc = "";
-    }
-
-    route_add_head(RT);
-
-    /* route points */
-    for (j=0; j<rte->wptnum; j++) {
-      WP = get_wpt(&wprdata, rte->wptidx[j]);
-      if (WP != nullptr) {
-        route_add_wpt(RT, WP);
-      }
-    }
-  }
-}
-
-static void trl_read()
-{
-  struct trldata trldata;
-  int i, j;
-
-  for (i=0; i<MAXTRK; i+=2) {
-    gbfseek(fin, 0x10000 * (i/2), SEEK_SET);
-    if (gbfread(&(trldata.trklog[i]), sizeof(struct trklog), 2, fin) != 2) {
-      fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file.\n", fin->name);
-    }
-  }
-  gbfseek(fin, 0x10000 * MAXTRK/2, SEEK_SET);
-  if (gbfread(&(trldata.loghdr), sizeof(struct loghdr), 1, fin) != 1) {
-    fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file.\n", fin->name);
-  }
-  trl_swap(&trldata);
-  if (trldata.loghdr.id != TRL_HDR_ID) {
-    fatal(MYNAME ": %s is not in Alan .trl format.\n", fin->name);
-  }
-
-  for (i=0; i<MAXTRK; i++) {
-    /* track header */
-    struct trkhdr* trkhdr = &(trldata.loghdr.trkhdr[i]);
-    if (trkhdr->occupied == TRK_UNUSED) {
-      continue;
-    }
-    auto* TL = new route_head;
-    for (j=TRK_NAME_LEN-1;
-         j >= 0 && (trkhdr->name[j] == ' ' || trkhdr->name[j] == '\0');
-         j--) {}
-    char *s1 = xstrndup(trkhdr->name,j+1);
-    TL->rte_name = s1;
-    xfree(s1);
-    /*  TL->rte_name[TRK_NAME_LEN+1] = 0; */   /* MAYBE BAD ADDRESS (Valgrind) */
-    for (j=TRK_COMMENT_LEN-1;
-         j >= 0 && (trkhdr->comment[j] == ' ' || trkhdr->comment[j] == '\0');
-         j--) {}
-    s1 = xstrndup(trkhdr->comment,j+1);
-    TL->rte_desc = s1;
-    xfree(s1);
-    /*  TL->rte_desc[TRK_COMMENT_LEN+1] = 0; */        /* MAYBE BAD ADDRESS (Valgrind) */
-    TL->rte_num = i;
-
-    track_add_head(TL);
-
-    /* track points */
-    struct trklog* trklog = &(trldata.trklog[i]);
-    for (j=0; j<trkhdr->totalpt; j++) {
-      auto* WP = new Waypoint;
-      WP->latitude  = -pt2deg(trklog->pt[j].y);
-      WP->longitude =  pt2deg(trklog->pt[j].x);
-      WP->altitude  =  hgt2m(trklog->sh[j].height);
-      if (trklog->sh[j].speed >= 0)
-        WAYPT_SET(WP, speed, sp2mps(trklog->sh[j].speed));
-        else {                 /* bad speed < 0 - set to 0.0 */
-          WAYPT_UNSET(WP, speed);
-        }
-      track_add_wpt(TL, WP);
-    }
-  }
-}
-
-/**************************************************************************/
-
-static int find_wpt(struct wprdata* wprdata, const Waypoint* WP)
-{
-  struct wpt pattern;
-
-  str2lab(pattern.name, WP->shortname, WPT_NAME_LEN, nullptr, 0);
-  pattern.pt.x = deg2pt(WP->longitude);
-  pattern.pt.y = deg2pt(-WP->latitude);
-
-  struct wpt* wpt = wprdata->wpt;
-  for (int i = 0; i<MAXWPT; i++) {
-    int wpt_idx = wprdata->wpthdr.idx[i];
-    if (wpt_idx == WPT_IDX_NONE ||
-        wprdata->wpthdr.used[wpt_idx] == WPT_UNUSED) {
-      continue;
-    }
-    if (strncmp(wpt[wpt_idx].name, pattern.name, WPT_NAME_LEN) == 0 &&
-        wpt[wpt_idx].pt.x == pattern.pt.x &&
-        wpt[wpt_idx].pt.y == pattern.pt.y) {
-      return i;
-    }
-  }
-
-  return -1;
-}
-
-static int add_wpt(struct wprdata* wprdata, const Waypoint* WP,int isroute)
-{
-  struct wpt* wpt;
-  int i;
-
-  struct wpthdr* wpthdr = &(wprdata->wpthdr);
-
-  int hdr_idx = find_wpt(wprdata, WP);
-  if (hdr_idx >= 0) {
-    /* duplicate waypoint */
-    if (isroute) {
-      wpt = &(wprdata->wpt[wpthdr->idx[hdr_idx]]);
-      wpt->usecount ++;
-    }
-    return hdr_idx;
-  }
-
-  for (i=0; i<MAXWPT && wpthdr->idx[i] != WPT_IDX_NONE; i++) { }
-  hdr_idx = i;
-  for (i=0; i<MAXWPT && wpthdr->used[i] != WPT_UNUSED; i++) { }
-  int wpt_idx = i;
-  if (wpthdr->num >= MAXWPT || hdr_idx >= MAXWPT || wpt_idx >= MAXWPT) {
-    fatal(MYNAME ": Can't store more than %u waypoints\n", MAXWPT);
-  }
-
-  wpt = &(wprdata->wpt[wpt_idx]);
-  str2lab(wpt->name, WP->shortname, WPT_NAME_LEN, "W%05d", wpt_idx);
-  str2lab(wpt->comment, WP->description, WPT_COMMENT_LEN, nullptr, 0);
-  wpt->pt.x = deg2pt(WP->longitude);
-  wpt->pt.y = deg2pt(-WP->latitude);
-  wpt->usecount = isroute ? 1 : 0;
-  wpt->checked  = isroute ? 0 : 1;
-  wpt->reserved = 0;
-  pack_time(WP->GetCreationTime().toTime_t(), &(wpt->date), &(wpt->time));
-
-  wpthdr->idx[hdr_idx] = wpt_idx;
-  wpthdr->used[wpt_idx] = WPT_USED;
-  wpthdr->num++;
-  wpthdr->next++;
-  if (wpthdr->next >= MAXWPT) {        /* overrun */
-    wpthdr->next = 0;
-  }
-
-  return hdr_idx;
-}
-
-static void wpr_waypoint(const Waypoint* WP)
-{
-  add_wpt(&WPR, WP, 0);
-}
-
-static void wpr_route_hdr(const route_head* RT)
-{
-  int i;
-
-  struct rtehdr* rtehdr = &(WPR.rtehdr);
-  for (i=0; i<MAXRTE && rtehdr->idx[i] != RTE_IDX_NONE; i++) { }
-  int hdr_idx = i;
-  for (i=0; i<MAXRTE && rtehdr->used[i] != RTE_UNUSED; i++) { }
-  int rte_idx = i;
-  if (rtehdr->num >= MAXRTE || hdr_idx >= MAXRTE || rte_idx >= MAXRTE) {
-    fatal(MYNAME ": Can't store more than %u routes", MAXRTE);
-  }
-
-  struct rte* rte = &(WPR.rte[rte_idx]);
-  str2lab(rte->name, RT->rte_name, RTE_NAME_LEN, "R%03d", rte_idx);
-  str2lab(rte->comment, RT->rte_desc, RTE_COMMENT_LEN, nullptr, 0);
-  pack_time(time(nullptr), &(rte->date), &(rte->time));
-
-  rtehdr->idx[hdr_idx] = rte_idx;
-  rtehdr->used[rte_idx] = RTE_USED;
-  rtehdr->num++;
-  rtehdr->next++;
-  if (rtehdr->next >= MAXRTE) {        /* overrun */
-    rtehdr->next = 0;
-  }
-
-  /* if you want the new route to be active, uncomment the next line */
-  /* rtehdr->rteno = rte_idx; */
-}
-
-static void wpr_route_wpt(const Waypoint* WP)
-{
-  struct rte* rte = &(WPR.rte[WPR.rtehdr.num -1]);
-  if (rte->wptnum >= MAXWPTINRTE) {
-    fatal(MYNAME ": Can't store more than %u waypoints per route", MAXWPTINRTE);
-  }
-
-  int wpt_idx = add_wpt(&WPR, WP, 1);
-
-  rte->wptidx[rte->wptnum] = wpt_idx;
-  rte->wptnum ++;
-}
-
-static void wpr_route_trl(const route_head*)
-{
-  /* should we do some final sanity checks? */
-}
-
-static void wpr_write()
-{
-  int i;
-
-  WPR.wpthdr.id = WPT_HDR_ID;
-  WPR.wpthdr.num = WPR.wpthdr.next = 0;
-  for (i=0; i<MAXWPT; i++) {
-    WPR.wpthdr.idx[i]  = WPT_IDX_NONE;
-    WPR.wpthdr.used[i] = WPT_UNUSED;
-  }
-  memset(WPR.wpt, 0, MAXWPT * sizeof(struct wpt));
-  WPR.rtehdr.id = RTE_HDR_ID;
-  WPR.rtehdr.num = WPR.rtehdr.next = 0;
-  for (i=0; i<MAXRTE; i++) {
-    WPR.rtehdr.idx[i] = RTE_IDX_NONE;
-    WPR.rtehdr.used[i] = RTE_UNUSED;
-  }
-  WPR.rtehdr.rteno = RTE_RTENO_NONE;
-  memset(WPR.rte, 0, MAXRTE * sizeof(struct rte));
-
-  waypt_disp_all(wpr_waypoint);
-  route_disp_all(wpr_route_hdr, wpr_route_trl, wpr_route_wpt);
-
-  wpr_swap(&WPR);
-  if (gbfwrite(&WPR, sizeof(struct wprdata), 1, fout) != 1) {
-    fatal(MYNAME ": Write error on %s\n", fout->name);
-  }
-}
-
-/**************************************************************************/
-
-static void trl_track_hdr(const route_head* TL)
-{
-  int idx;
-
-  struct trkhdr* trkhdr = TRL.loghdr.trkhdr;
-
-  for (idx=0; idx< MAXTRK && trkhdr[idx].occupied != TRK_UNUSED; idx++) {}
-  if (idx >= MAXTRK) {
-    fatal(MYNAME ": Can't store more than %u tracklogs", MAXTRK);
-  }
-
-  if (!TL->rte_name.isEmpty()) {
-    strncpy(trkhdr[idx].name, CSTRc(TL->rte_name), TRK_NAME_LEN - 1);
-  }
-  if (*(trkhdr[idx].name) == '\0') {
-    sprintf(trkhdr[idx].name, "T%03d", idx);
-  }
-  trkhdr[idx].name[TRK_NAME_LEN-1] = '\0';
-
-  if (!TL->rte_desc.isEmpty()) {
-    strncpy(trkhdr[idx].comment, CSTRc(TL->rte_desc), TRK_COMMENT_LEN - 1);
-    int l = strlen(CSTRc(TL->rte_desc));
-    if (l < TRK_COMMENT_LEN-1) {
-      memset(trkhdr[idx].comment + l, ' ', TRK_COMMENT_LEN - 1 - l);
-    }
-  }
-  trkhdr[idx].comment[TRK_COMMENT_LEN-1] = '\0';
-
-  trkhdr[idx].occupied = TRK_USED;
-  trkhdr[idx].totalpt = 0;
-  trkhdr[idx].next = 0;
-
-  TRL.loghdr.num = idx;
-}
-
-static void trl_track_wpt(const Waypoint* WP)
-{
-  int trk_idx = TRL.loghdr.num;
-
-  struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[trk_idx]);
-  if (trkhdr->totalpt >= MAXPTINTRK) {
-    fatal(MYNAME ": Can't store more than %u points per track", MAXPTINTRK);
-  }
-  int log_idx = trkhdr->next;
-
-  struct trklog* trklog = &(TRL.trklog[trk_idx]);
-  trklog->pt[log_idx].x = deg2pt(WP->longitude);
-  trklog->pt[log_idx].y = deg2pt(-WP->latitude);
-  if WAYPT_HAS(WP, speed) {
-    trklog->sh[log_idx].speed =  mps2sp(WP->speed);
-  }
-  if (WP->altitude != unknown_alt) {
-    trklog->sh[log_idx].height = m2hgt(WP->altitude);
-  }
-
-  trkhdr->totalpt ++;
-  trkhdr->next = trkhdr->totalpt;
-}
-
-static void trl_track_tlr(const route_head*)
-{
-  int trk_idx = TRL.loghdr.num;
-  struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[trk_idx]);
-
-  if (trkhdr->totalpt == 0) {
-    trkhdr->occupied = TRK_UNUSED;
-  }
-
-  TRL.loghdr.num = -1;
-}
-
-static void trl_write()
-{
-  int i;
-
-  TRL.loghdr.id = TRL_HDR_ID;
-  TRL.loghdr.num = TRL.loghdr.next = -1;
-  TRL.loghdr.date = TRL.loghdr.time = 0;
-  for (i=0; i<MAXTRK; i++) {
-    struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[i]);
-    trkhdr->totalpt = 0;
-    trkhdr->next = 0;
-    memset(trkhdr->name, 0, TRK_NAME_LEN);
-    memset(trkhdr->comment, ' ', TRK_COMMENT_LEN);
-    trkhdr->comment[TRK_COMMENT_LEN-1] = '\0';
-    trkhdr->occupied = TRK_UNUSED;
-    trkhdr->show = TRK_HIDE;
-    trkhdr->fill = TRK_FILL;
-  }
-  memset(TRL.trklog, 0xff, sizeof(struct trklog) * MAXTRK);
-
-  track_disp_all(trl_track_hdr, trl_track_tlr, trl_track_wpt);
-
-  trl_swap(&TRL);
-
-  size_t fill = 0x10000 - 2 * sizeof(struct trklog);
-  void* buf = xmalloc(fill);
-  if (buf == nullptr) {
-    fatal(MYNAME ": Not enough memory\n");
-  }
-  memset(buf, 0xff, fill);
-
-  for (i=0; i<MAXTRK; i+=2) {
-    if (gbfwrite(&(TRL.trklog[i]), sizeof(struct trklog), 2, fout) != 2 ||
-        gbfwrite(buf, fill, 1, fout) != 1) {
-      fatal(MYNAME ": Write error on %s\n", fout->name);
-    }
-  }
-  xfree(buf);
-
-  fill = 0x1000 - sizeof(struct loghdr);
-  buf = xmalloc(fill);
-  if (buf == nullptr) {
-    fatal(MYNAME ": Not enough memory\n");
-  }
-  memset(buf, 0xff, fill);
-
-  if (gbfwrite(&(TRL.loghdr), sizeof(struct loghdr), 1, fout) != 1 ||
-      gbfwrite(buf, fill, 1, fout) != 1) {
-    fatal(MYNAME ": Write error on %s\n", fout->name);
-  }
-  xfree(buf);
-}
-
-/**************************************************************************/
-
-static void alan_rd_init(const QString& fname)
-{
-  fin = gbfopen(fname, "rb", MYNAME);
-}
-
-static void alan_rd_deinit()
-{
-  gbfclose(fin);
-  fin = nullptr;
-}
-
-
-static void alan_wr_init(const QString& fname)
-{
-  fout = gbfopen(fname, "wb", MYNAME);
-}
-
-static void alan_wr_deinit()
-{
-  gbfclose(fout);
-  fout = nullptr;
-}
-
-/**************************************************************************/
-
-ff_vecs_t alanwpr_vecs = {
-  ff_type_file,
-  {
-    (ff_cap)(ff_cap_read | ff_cap_write)       /* waypoints */,
-    ff_cap_none                /* tracks */,
-    (ff_cap)(ff_cap_read | ff_cap_write)       /* routes */
-  },
-  alan_rd_init,
-  alan_wr_init,
-  alan_rd_deinit,
-  alan_wr_deinit,
-  wpr_read,
-  wpr_write,
-  nullptr,
-  &wpr_args,
-  CET_CHARSET_ASCII, 0, /* ascii is the expected character set */
-  /* not fixed, can be changed through command line parameter */
-  NULL_POS_OPS,
-  nullptr
-};
-
-ff_vecs_t alantrl_vecs = {
-  ff_type_file,
-  {
-    ff_cap_none                /* waypoints */,
-    (ff_cap)(ff_cap_read | ff_cap_write)       /* tracks */,
-    ff_cap_none                /* routes */
-  },
-  alan_rd_init,
-  alan_wr_init,
-  alan_rd_deinit,
-  alan_wr_deinit,
-  trl_read,
-  trl_write,
-  nullptr,
-  &trl_args,
-  CET_CHARSET_ASCII, 0, /* ascii is the expected character set */
-  /* not fixed, can be changed through command line parameter */
-  NULL_POS_OPS,
-  nullptr
-};
diff --git a/an1.cc b/an1.cc
deleted file mode 100644 (file)
index b773f0f..0000000
--- a/an1.cc
+++ /dev/null
@@ -1,1152 +0,0 @@
-/*
-    Read DeLorme drawing files (.an1)
-
-    Copyright (C) 2005-2014 Ron Parker and Robert Lipe.
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
- */
-
-#include <cstdio>               // for sprintf, SEEK_CUR
-#include <cstdint>              // for int32_t
-#include <cstdlib>              // for atoi, atof
-#include <cstring>              // for strlen, strchr, memcpy, strstr
-
-#include <QtCore/QString>       // for QString
-#include <QtCore/QVector>       // for QVector
-
-#include "defs.h"
-#include "formspec.h"           // for FsChainAdd, FsChainFind, FormatSpecificData, kFsAn1L, kFsAn1V, kFsAn1W
-#include "gbfile.h"             // for gbfgetint32, gbfputint32, gbfputint16, gbfgetint16, gbfile, gbfputs, gbfgetc, gbfputc, gbfclose, gbfopen_le, gbfgetdbl, gbfputdbl, gbfread, gbfseek
-#include "src/core/datetime.h"  // for DateTime
-
-
-#define MYNAME "an1"
-
-static gbfile* infile;
-static gbfile* outfile;
-
-static char* output_type = nullptr;
-static char* road_changes = nullptr;
-static char* nogc = nullptr;
-static char* nourl = nullptr;
-static char* opt_symbol = nullptr;
-static char* opt_color = nullptr;
-static char* opt_zoom  = nullptr;
-static char* opt_wpt_type = nullptr;
-static char* opt_radius = nullptr;
-
-static short output_type_num = 0;
-static short opt_zoom_num = 0;
-static long opt_color_num = 0;
-static short wpt_type_num = 0;
-static short last_read_type = 0;
-static double radius = 0.0;
-
-static long serial=10000;
-static long rtserial=1;
-
-struct roadchange {
-  long type;
-  char* name;
-};
-
-static roadchange* roadchanges = nullptr;
-
-static
-QVector<arglist_t> an1_args = {
-  {
-    "type", &output_type, "Type of .an1 file",
-    "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "road", &road_changes, "Road type changes",
-    "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "nogc", &nogc, "Do not add geocache data to description",
-    nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
-  },
-  {
-    "nourl", &nourl, "Do not add URLs to description",
-    nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
-  },
-  {
-    "deficon", &opt_symbol, "Symbol to use for point data",
-    "Red Flag", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "color", &opt_color, "Color for lines or mapnotes",
-    "red", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "zoom", &opt_zoom, "Zoom level to reduce points",
-    nullptr, ARGTYPE_INT, ARG_NOMINMAX, nullptr
-  },
-  {
-    "wpt_type", &opt_wpt_type,
-    "Waypoint type",
-    "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "radius", &opt_radius, "Radius for circles",
-    nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-};
-
-struct guid_t {
-  unsigned long l;
-  unsigned short s[3];
-  unsigned char c[6];
-};
-
-#include "an1sym.h"
-
-#define ReadShort(f) gbfgetint16(f)
-#define WriteShort(f,s) gbfputint16((s),f)
-#define ReadLong(f) gbfgetint32(f)
-#define WriteLong(f,l) gbfputint32((l),f)
-#define ReadDouble(f) gbfgetdbl(f)
-#define WriteDouble(f,d) gbfputdbl((d),f)
-
-static char*
-ReadString(gbfile* f, short len)
-{
-  auto* result = (char*)xcalloc(1, len + 1);
-  if (len) {
-    gbfread(result, 1, len, f);
-  }
-  return result;
-}
-
-#define ReadChar(f) (unsigned char) gbfgetc(f)
-#define WriteChar(f,c) gbfputc((unsigned char)(c),f)
-#define WriteString(f,s) gbfputs((s),f)
-
-static void
-ReadGuid(gbfile* f, guid_t* guid)
-{
-  guid->l = ReadLong(f);
-  for (unsigned short& i : guid->s) {
-    i = ReadShort(f);
-  }
-  for (unsigned char& i : guid->c) {
-    i = ReadChar(f);
-  }
-}
-
-static void
-WriteGuid(gbfile* f, guid_t* guid)
-{
-  WriteLong(f, guid->l);
-  for (int i = 0; i < 3; i++) {
-    WriteShort(f, guid->s[i]);
-  }
-  for (int i = 0; i < 6; i++) {
-    WriteChar(f, guid->c[i]);
-  }
-}
-
-static void
-Skip(gbfile* f,
-     unsigned long distance)
-{
-  gbfseek(f, distance, SEEK_CUR);
-}
-
-static double
-DecodeOrd(long ord)
-{
-  return (double)((int32_t)(0x80000000 - ord)) / 0x800000;
-}
-
-static long
-EncodeOrd(double ord)
-{
-  return (int32_t)(0x80000000 - (int32_t)(ord * 0x800000));
-}
-
-struct an1_symbol_record {
-  short hotspotxhi{0};
-  long hotspoty{0};
-  long unk1{0};
-  guid_t guid{};
-  char* name{nullptr};
-};
-
-struct an1_waypoint_record : FormatSpecificData {
-  an1_waypoint_record() : FormatSpecificData(kFsAn1W) {}
-private:
-  an1_waypoint_record(const an1_waypoint_record&) = default;
-public:
-  an1_waypoint_record& operator=(const an1_waypoint_record&) = delete;
-  an1_waypoint_record(an1_waypoint_record&&) = delete;
-  an1_waypoint_record& operator=(an1_waypoint_record&&) = delete;
-  ~an1_waypoint_record() override
-  {
-    xfree(name);
-    xfree(fontname);
-    xfree(url);
-    xfree(comment);
-    xfree(image_name);
-  }
-
-  an1_waypoint_record* clone() const override
-  {
-    auto* copy = new an1_waypoint_record(*this);
-    copy->name = xstrdup(name);
-    copy->fontname = xstrdup(fontname);
-    copy->url = xstrdup(url);
-    copy->comment = xstrdup(comment);
-    copy->image_name = xstrdup(image_name);
-    return copy;
-  }
-
-  short magic{0};
-  long unk1{0};
-  long lon{0};
-  long lat{0};
-  short type{0};
-  long height{0};
-  long width{0};
-  short unk2{0};
-  short unk3{0};
-  short serial{0};
-  short unk4{0};
-  unsigned char create_zoom{0};
-  unsigned char visible_zoom{0};
-  short unk5{0};
-  double radius{0.0}; /* in km */
-  char* name{nullptr};
-  char* fontname{nullptr};
-  guid_t guid{};
-  long fontcolor{0};
-  long fontstyle{0};
-  long fontsize{0};
-  long outlineweight{0};
-  long outlinecolor{0};
-  long outlineflags{0};
-  long fillcolor{0};
-  long unk6{0};
-  long fillflags{0};
-
-  /* Added in SA2006/Topo 6.0 */
-  short unk6_1{0};
-  char* url{nullptr};
-  char* comment{nullptr};
-  long creation_time{0};
-  long modification_time{0};
-  char* image_name{nullptr};
-};
-
-struct an1_vertex_record : FormatSpecificData {
-  an1_vertex_record() : FormatSpecificData(kFsAn1V) {}
-  an1_vertex_record* clone() const override
-  {
-    return new an1_vertex_record(*this);
-  }
-
-  short magic{0};
-  long unk0{0};
-  long lon{0};
-  long lat{0};
-  short unk1{0};
-};
-
-struct an1_line_record : FormatSpecificData {
-  an1_line_record() : FormatSpecificData(kFsAn1L) {}
-private:
-  an1_line_record(const an1_line_record&) = default;
-public:
-  an1_line_record& operator=(const an1_line_record&) = delete;
-  an1_line_record(an1_line_record&&) = delete;
-  an1_line_record& operator=(an1_line_record&&) = delete;
-  ~an1_line_record() override
-  {
-    xfree(name);
-  }
-
-  an1_line_record* clone() const override
-  {
-    auto* copy = new an1_line_record(*this);
-    copy->name = xstrdup(name);
-    return copy;
-  }
-
-  long roadtype{0};
-  short serial{0};
-  long unk2{0};
-  short unk3{0};
-  short type{0};
-  long unk4{0};
-  char* name{nullptr};
-  long lineweight{0};
-  long linestyle{0};
-  long linecolor{0};
-  long opacity{0};
-  long polyfillcolor{0};
-  long unk6{0};
-  long unk7{0};
-  short unk8{0};
-  long pointcount{0};
-};
-
-static void Destroy_AN1_Symbol(an1_symbol_record* symbol)
-{
-  xfree(symbol->name);
-}
-
-static void Read_AN1_Waypoint(gbfile* f, an1_waypoint_record* wpt)
-{
-  wpt->magic = ReadShort(f);
-  wpt->unk1 = ReadLong(f);
-  wpt->lon = ReadLong(f);
-  wpt->lat = ReadLong(f);
-  wpt->type = ReadShort(f);
-  wpt->height = ReadLong(f);
-  wpt->width = ReadLong(f);
-  wpt->unk2 = ReadShort(f);
-  wpt->unk3 = ReadShort(f);
-  wpt->serial = ReadShort(f);
-  wpt->unk4 = ReadShort(f);
-  wpt->create_zoom = ReadChar(f);
-  wpt->visible_zoom = ReadChar(f);
-  wpt->unk5 = ReadShort(f);
-  wpt->radius = ReadDouble(f);
-  unsigned short len = ReadShort(f);
-  wpt->name = ReadString(f, len);
-
-  if (len != strlen(wpt->name)) {
-    /* This happens in 06/6.0 files that put extra data in the
-     * name record for backward compatibility's sake */
-    char* ofs = wpt->name + strlen(wpt->name) + 1;
-    wpt->unk6_1 = le_read16(ofs);
-    ofs += 2;
-
-    len = le_read16(ofs);
-    ofs += 2;
-
-    if (len) {
-      /*
-       * Trust URL encoded in new format over one in
-       * old format if both are present.  Whack the
-       * name starting at '{URL='.
-       */
-      char* oldurlstr = strstr(wpt->name, "{URL=");
-      if (oldurlstr) {
-        *oldurlstr = 0;
-      }
-      wpt->url = (char*) xcalloc(len+1, 1);
-      memcpy(wpt->url, ofs, len);
-      ofs += len;
-    }
-
-    len = le_read16(ofs);
-    ofs += 2;
-
-    if (len) {
-      wpt->comment = (char*) xcalloc(len+1, 1);
-      memcpy(wpt->comment, ofs, len);
-      ofs += len;
-    }
-
-    /* these are quadwords, presumably for year-2038 compat. */
-    wpt->creation_time = le_read32(ofs);
-    ofs += 8;
-
-    wpt->modification_time = le_read32(ofs);
-    ofs += 8;
-  }
-
-  if (wpt->type == 0x12) {
-    /* 'image' type */
-    ReadShort(f);    /* length of font + filename */
-    len = ReadShort(f);
-    wpt->fontname = ReadString(f, len);
-    len = ReadShort(f);
-    wpt->image_name = ReadString(f, len);
-  } else {
-    len = ReadShort(f);
-    wpt->fontname = ReadString(f, len);
-    wpt->image_name = nullptr;
-  }
-  ReadGuid(f, &wpt->guid);
-  wpt->fontcolor = ReadLong(f);
-  wpt->fontstyle = ReadLong(f);
-  wpt->fontsize = ReadLong(f);
-  wpt->outlineweight = ReadLong(f);
-  wpt->outlinecolor = ReadLong(f);
-  wpt->outlineflags = ReadLong(f);
-  wpt->fillcolor = ReadLong(f);
-  wpt->unk6 = ReadLong(f);
-  wpt->fillflags = ReadLong(f);
-}
-
-static void Write_AN1_Waypoint(gbfile* f, an1_waypoint_record* wpt)
-{
-  WriteShort(f, wpt->magic);
-  WriteLong(f, wpt->unk1);
-  WriteLong(f, wpt->lon);
-  WriteLong(f, wpt->lat);
-  WriteShort(f, wpt->type);
-  WriteLong(f, wpt->height);
-  WriteLong(f, wpt->width);
-  WriteShort(f, wpt->unk2);
-  WriteShort(f, wpt->unk3);
-  WriteShort(f, wpt->serial);
-  WriteShort(f, wpt->unk4);
-  WriteChar(f, wpt->create_zoom);
-  WriteChar(f, wpt->visible_zoom);
-  WriteShort(f, wpt->unk5);
-  WriteDouble(f, wpt->radius);
-
-  short len = strlen(wpt->name) + 1 + 2 + 2 +
-              (wpt->url ? strlen(wpt->url) : 0) + 2 +
-              (wpt->comment ? strlen(wpt->comment) : 0) + 8 + 8;
-  WriteShort(f, len);
-  WriteString(f, wpt->name);
-  WriteChar(f, 0);    /* name string terminator */
-
-  WriteShort(f, wpt->unk6_1);
-
-  if (wpt->url) {
-    WriteShort(f, strlen(wpt->url));
-    WriteString(f, wpt->url);
-  } else {
-    WriteShort(f, 0);
-  }
-
-  if (wpt->comment) {
-    WriteShort(f, strlen(wpt->comment));
-    WriteString(f, wpt->comment);
-  } else {
-    WriteShort(f, 0);
-  }
-
-  WriteLong(f, wpt->creation_time);
-  WriteLong(f, 0);
-
-  WriteLong(f, wpt->modification_time);
-  WriteLong(f, 0);
-
-  if (wpt->type == 0x12) {   /* image */
-    len = 2 + (wpt->fontname ? strlen(wpt->fontname) : 0) +
-          2 + (wpt->image_name ? strlen(wpt->image_name) : 0);
-    WriteShort(f, len);
-    if (wpt->fontname) {
-      len = strlen(wpt->fontname);
-      WriteShort(f, len);
-      WriteString(f, wpt->fontname);
-    } else {
-      WriteShort(f, 0);
-    }
-    if (wpt->image_name) {
-      len = strlen(wpt->image_name);
-      WriteShort(f, len);
-      WriteString(f, wpt->image_name);
-    } else {
-      WriteShort(f, 0);
-    }
-  } else {
-    len = strlen(wpt->fontname);
-    WriteShort(f, len);
-    WriteString(f, wpt->fontname);
-  }
-  WriteGuid(f, &wpt->guid);
-  WriteLong(f, wpt->fontcolor);
-  WriteLong(f, wpt->fontstyle);
-  WriteLong(f, wpt->fontsize);
-  WriteLong(f, wpt->outlineweight);
-  WriteLong(f, wpt->outlinecolor);
-  WriteLong(f, wpt->outlineflags);
-  WriteLong(f, wpt->fillcolor);
-  WriteLong(f, wpt->unk6);
-  WriteLong(f, wpt->fillflags);
-}
-
-static void Read_AN1_Vertex(gbfile* f, an1_vertex_record* vertex)
-{
-
-  vertex->magic = ReadShort(f);
-  vertex->unk0 = ReadLong(f);
-  vertex->lon = ReadLong(f);
-  vertex->lat = ReadLong(f);
-  vertex->unk1 = ReadShort(f);
-}
-
-static void Write_AN1_Vertex(gbfile* f, an1_vertex_record* vertex)
-{
-  WriteShort(f, vertex->magic);
-  WriteLong(f, vertex->unk0);
-  WriteLong(f, vertex->lon);
-  WriteLong(f, vertex->lat);
-  WriteShort(f, vertex->unk1);
-}
-
-static void Read_AN1_Line(gbfile* f, an1_line_record* line)
-{
-  line->roadtype = ReadLong(f);
-  line->serial = ReadShort(f);
-  line->unk2 = ReadLong(f);
-  line->unk3 = ReadShort(f);
-  line->type = ReadShort(f);
-  line->unk4 = ReadLong(f);
-  short len = ReadShort(f);
-  line->name = ReadString(f, len);
-  line->lineweight = ReadShort(f);
-  line->linestyle = ReadLong(f);
-  line->linecolor = ReadLong(f);
-  line->opacity = ReadLong(f);
-  line->polyfillcolor = ReadLong(f);
-  line->unk6 = ReadLong(f);
-  line->unk7 = ReadLong(f);
-  line->unk8 = ReadShort(f);
-  line->pointcount = ReadLong(f);
-}
-
-static void Write_AN1_Line(gbfile* f, an1_line_record* line)
-{
-  WriteLong(f, line->roadtype);
-  WriteShort(f, line->serial);
-  WriteLong(f, line->unk2);
-  WriteShort(f, line->unk3);
-  WriteShort(f, line->type);
-  WriteLong(f, line->unk4);
-  short len = strlen(line->name);
-  WriteShort(f, len);
-  WriteString(f, line->name);
-  WriteShort(f, (short) line->lineweight);
-  WriteLong(f, line->linestyle);
-  WriteLong(f, line->linecolor);
-  WriteLong(f, line->opacity);
-  WriteLong(f, line->polyfillcolor);
-  WriteLong(f, line->unk6);
-  WriteLong(f, line->unk7);
-  WriteShort(f, line->unk8);
-  WriteLong(f, line->pointcount);
-}
-
-static void Skip_AN1_IL(gbfile* f)
-{
-  Skip(f, 26);
-}
-
-static void Skip_AN1_BM(gbfile* f)
-{
-  Skip(f, 8);    /* BITMAPFILEHEADER fields 1-3 */
-  unsigned long bitoffset = ReadLong(f);
-
-  unsigned long bmisize = ReadLong(f);
-  Skip(f, 16);    /* BITMAPINFOHEADER fields 2-6 */
-  unsigned long bmsize = ReadLong(f);
-  Skip(f, 16);    /* BITMAPINFOHEADER fields 8-11 */
-
-  unsigned long palettesize = bitoffset - bmisize - 14;
-  Skip(f, bmsize + palettesize);
-}
-
-static void Read_AN1_Symbol(gbfile* f, an1_symbol_record* symbol)
-{
-  /* This is just the high word of a long; we ate the low
-   * word in the caller.  Fortunately, we don't care. */
-  symbol->hotspotxhi = ReadShort(f);
-  symbol->hotspoty = ReadLong(f);
-  symbol->unk1 = ReadLong(f);
-  ReadGuid(f, &symbol->guid);
-  short len = ReadChar(f);
-  symbol->name = ReadString(f, len);
-}
-
-static void Read_AN1_Header(gbfile* f)
-{
-  unsigned short magic = ReadShort(f);
-  (void) magic; // hush warning.
-  unsigned short type = ReadShort(f);
-
-  last_read_type = type;
-}
-
-static void Write_AN1_Header(gbfile* f)
-{
-  WriteShort(f, 11557);
-  WriteShort(f, output_type_num);
-}
-
-static void Read_AN1_Bitmaps(gbfile* f)
-{
-  an1_symbol_record symbol;
-
-  long count = ReadLong(f);
-
-  while (count) {
-    unsigned short magic = ReadShort(f);
-    switch (magic) {
-    case 0x4d42:
-      Skip_AN1_BM(f);
-      break;
-    case 0x4c49:
-      Skip_AN1_IL(f);
-      break;
-    default:
-      Read_AN1_Symbol(f, &symbol);
-      Destroy_AN1_Symbol(&symbol);
-      count--;
-      break;
-    }
-  }
-
-  /* Read the symbol table */
-}
-
-static void Write_AN1_Bitmaps(gbfile* f)
-{
-  /* On write, we don't output any bitmaps, so writing them
-   * is just a matter of writing a count of zero */
-  WriteLong(f, 0);
-}
-
-static void Read_AN1_Waypoints(gbfile* f)
-{
-  const char* icon = nullptr;
-  ReadShort(f);
-  unsigned long count = ReadLong(f);
-  for (unsigned long i = 0; i < count; i++) {
-    auto* rec = new an1_waypoint_record;
-    Read_AN1_Waypoint(f, rec);
-    auto* wpt_tmp = new Waypoint;
-
-    if (rec->creation_time) {
-      wpt_tmp->SetCreationTime(rec->creation_time);
-    }
-    wpt_tmp->longitude = -DecodeOrd(rec->lon);
-    wpt_tmp->latitude = DecodeOrd(rec->lat);
-    wpt_tmp->notes = rec->comment;
-    wpt_tmp->description = rec->name;
-
-    if (rec->url) {
-      wpt_tmp->AddUrlLink(rec->url);
-    } else {
-      int u = wpt_tmp->description.indexOf("{URL=");
-      if (u != -1) {
-        QString us = wpt_tmp->description.mid(u);
-        us.remove(0,5); // throw away anything up to and including "{URL="
-        us.chop(1); // throw away final character, assumed to be "}"
-        if (!us.isEmpty()) {
-          wpt_tmp->AddUrlLink(us);
-        }
-      }
-    }
-
-    if (rec->image_name) {
-      wpt_tmp->icon_descr = rec->image_name;
-    } else if (FindIconByGuid(&rec->guid, &icon)) {
-      wpt_tmp->icon_descr = icon;
-    }
-
-    wpt_tmp->fs.FsChainAdd(rec);
-    rec = nullptr;
-    waypt_add(wpt_tmp);
-  }
-}
-
-static void
-Write_One_AN1_Waypoint(const Waypoint* wpt)
-{
-  an1_waypoint_record* rec;
-
-  const auto* source_rec = reinterpret_cast<an1_waypoint_record*>(wpt->fs.FsChainFind(kFsAn1W));
-
-  if (source_rec != nullptr) {
-    rec = source_rec->clone();
-    if (opt_zoom) {
-      rec->visible_zoom = opt_zoom_num;
-    }
-  } else {
-    rec = new an1_waypoint_record;
-    rec->magic = 1;
-    rec->type = wpt_type_num;
-    rec->unk2 = 3;
-    rec->unk3 = 18561;
-    rec->radius = radius;
-    rec->fillcolor = opt_color_num;
-    rec->fillflags = 3;
-    if (wpt_type_num == 5) {
-      rec->fillflags = 0x8200;
-    }
-    rec->height = -50;
-    rec->width = 20;
-    rec->fontname = xstrdup("Arial");
-    FindIconByName(opt_symbol, &rec->guid);
-    rec->fontsize = 10;
-    rec->visible_zoom = opt_zoom?opt_zoom_num:10;
-    rec->unk6_1 = 1;
-  }
-  xfree(rec->name);
-  rec->name = xstrdup(wpt->description);
-
-  if (!nogc && wpt->gc_data->id) {
-    // FIXME: this whole mess should be qstring concatenation
-    auto* extra = (char*) xmalloc(25 + wpt->gc_data->placer.length() + wpt->shortname.length());
-    sprintf(extra, "\r\nBy %s\r\n%s (%1.1f/%1.1f)",
-            CSTR(wpt->gc_data->placer),
-            CSTRc(wpt->shortname), wpt->gc_data->diff/10.0,
-            wpt->gc_data->terr/10.0);
-    rec->name = xstrappend(rec->name, extra);
-    xfree(extra);
-  }
-
-  if (!nourl && wpt->HasUrlLink()) {
-    UrlLink l = wpt->GetUrlLink();
-    int len = 7 + l.url_.length();
-    auto* extra = (char*)xmalloc(len);
-    sprintf(extra, "{URL=%s}", CSTR(l.url_));
-    rec->name = xstrappend(rec->name, extra);
-    xfree(extra);
-    if (rec->url) {
-      xfree(rec->url);
-    }
-    rec->url = xstrdup(l.url_);
-  }
-  if (!wpt->notes.isEmpty()) {
-    if (rec->comment) {
-      xfree(rec->comment);
-    }
-    rec->comment = xstrdup(wpt->notes);
-  }
-
-
-  rec->creation_time = rec->modification_time = wpt->GetCreationTime().toTime_t();
-  rec->lat = EncodeOrd(wpt->latitude);
-  rec->lon = EncodeOrd(-wpt->longitude);
-  rec->serial = serial++;
-
-  if (rec->type == 0x12) {    /* image */
-    if (wpt->icon_descr.contains(":\\")) {
-      rec->image_name = xstrdup(wpt->icon_descr);
-      rec->height = -244;
-      rec->width = -1;
-    }
-  }
-  if (!rec->image_name && !wpt->icon_descr.isNull()) {
-    FindIconByName(CSTR(wpt->icon_descr), &rec->guid);
-  }
-
-  Write_AN1_Waypoint(outfile, rec);
-  delete rec;
-}
-
-static void Write_AN1_Waypoints(gbfile* f)
-{
-  WriteShort(f, 2);
-  WriteLong(f, waypt_count());
-  waypt_disp_all(Write_One_AN1_Waypoint);
-}
-
-static void Read_AN1_Lines(gbfile* f)
-{
-  ReadShort(f);
-  unsigned long count = ReadLong(f);
-  for (unsigned long i = 0; i < count; i++) {
-    auto* rec = new an1_line_record;
-    Read_AN1_Line(f, rec);
-    /* create route rec */
-    auto* rte_head = new route_head;
-    rte_head->line_color.bbggrr = rec->linecolor;
-    if (rec->opacity == 0x8200) {
-      rte_head->line_color.opacity = 128;
-    }
-    // lineweight isn't set for dashed/dotted lines
-    // Since we don't have a way to represent this internally yet,
-    // use leave line_width at the default.
-    if (rec->lineweight) {
-      rte_head->line_width = rec->lineweight;
-    }
-    rte_head->rte_name = rec->name;
-    rte_head->fs.FsChainAdd(rec);
-    route_add_head(rte_head);
-    for (unsigned long j = 0; j < (unsigned) rec->pointcount; j++) {
-      auto* vert = new an1_vertex_record;
-      Read_AN1_Vertex(f, vert);
-
-      /* create route point */
-      auto* wpt_tmp = new Waypoint;
-      wpt_tmp->latitude = DecodeOrd(vert->lat);
-      wpt_tmp->longitude = -DecodeOrd(vert->lon);
-      wpt_tmp->shortname = QString::asprintf("\\%5.5lx", rtserial++);
-      wpt_tmp->fs.FsChainAdd(vert);
-      route_add_wpt(rte_head, wpt_tmp);
-    }
-  }
-}
-
-static void
-Make_Road_Changes(an1_line_record* rec)
-{
-  int i = 0;
-
-  if (!rec) {
-    return;
-  }
-
-  if (!roadchanges) {
-    return;
-  }
-
-  while (roadchanges[i].name) {
-    if (!case_ignore_strcmp(roadchanges[i].name, rec->name)) {
-      rec->roadtype = roadchanges[i].type;
-      break;
-    }
-    i++;
-  }
-}
-
-static void
-Write_One_AN1_Line(const route_head* rte)
-{
-  an1_line_record* rec;
-
-  const auto* source_rec = reinterpret_cast<an1_line_record*>(rte->fs.FsChainFind(kFsAn1L));
-
-  if (source_rec != nullptr) {
-    rec = source_rec->clone();
-    switch (output_type_num) {
-    case 1:
-      if (rec->type != 14) {
-        rec->roadtype = 0x11100541;
-        rec->unk2 = 655360;
-        rec->type = 14;
-        rec->unk8 = 2;
-      } // end if
-      Make_Road_Changes(rec);
-      break;
-    case 2:
-      if (rec->type != 15) {
-        rec->type = 15;
-      } // end if
-      break;
-    case 4:
-      if (rec->type != 16) {
-        rec->type = 16;
-      } // end if
-      break;
-    }
-  } else {
-    rec = new an1_line_record;
-    rec->name = nullptr;
-    switch (output_type_num) {
-    /*  drawing road trail waypoint track  */
-    case 1: /* road */
-      rec->roadtype = 0x11100541;
-      rec->unk2 = 655360;
-      rec->type = 14;
-      rec->unk8 = 2;
-      rec->name = xstrdup(rte->rte_name);
-      break;
-
-    case 2: /* trail */
-      rec->roadtype = 0x11071c50;
-      rec->unk2 = 917504;
-      rec->type = 15;
-      rec->unk8 = 2;
-      break;
-
-    case 4: /* track */
-      rec->roadtype = 0x48800015;
-      rec->unk2 = 917504;
-      rec->type = 16;
-      rec->unk4 = 2;
-      rec->unk8 = 2;
-      break;
-
-    case 0: /* drawing */
-    case 3: /* waypoint - shouldn't have lines */
-    default:
-      rec->roadtype = 0x48800015;
-      rec->unk2 = 1048576;
-      rec->type = 2;
-      rec->unk4 = 2;
-      rec->lineweight = 6;
-      rec->linecolor = opt_color_num; /* red */
-      rec->opacity = 3;
-      rec->unk8 = 2;
-      break;
-    }
-    if (!rec->name) {
-      rec->name = xstrdup("");
-    }
-
-  }
-  rec->serial = serial++;
-  rec->pointcount = rte->rte_waypt_ct;
-  Write_AN1_Line(outfile, rec);
-  delete rec;
-}
-
-static void
-Write_One_AN1_Vertex(const Waypoint* wpt)
-{
-  an1_vertex_record* rec;
-
-  const auto* source_rec = reinterpret_cast<an1_vertex_record*>(wpt->fs.FsChainFind(kFsAn1V));
-
-  if (source_rec != nullptr) {
-    rec = source_rec->clone();
-  } else {
-    rec = new an1_vertex_record;
-    rec->magic = 1;
-  }
-  rec->lat = EncodeOrd(wpt->latitude);
-  rec->lon = EncodeOrd(-wpt->longitude);
-
-  Write_AN1_Vertex(outfile, rec);
-  delete rec;
-}
-
-static void Write_AN1_Lines(gbfile* f)
-{
-  WriteShort(f, 2);
-  WriteLong(f, route_count()+track_count());
-
-  route_disp_all(Write_One_AN1_Line, nullptr, Write_One_AN1_Vertex);
-  track_disp_all(Write_One_AN1_Line, nullptr, Write_One_AN1_Vertex);
-}
-
-static void
-Init_Wpt_Type()
-{
-  if (!opt_wpt_type || !opt_wpt_type[0]) {
-    wpt_type_num = 1; /* marker */
-    return;
-  }
-  if ((opt_wpt_type[0] & 0xf0) == 0x30) {
-    wpt_type_num = atoi(opt_wpt_type);
-  } else {
-    wpt_type_num = 1; /* marker */
-    if (!case_ignore_strcmp(opt_wpt_type, "marker")) {
-      wpt_type_num = 1;
-    } else if (!case_ignore_strcmp(opt_wpt_type, "symbol")) {
-      wpt_type_num = 1; /* symbol and marker are synonyms */
-    } else if (!case_ignore_strcmp(opt_wpt_type, "text")) {
-      wpt_type_num = 4;
-    } else if (!case_ignore_strcmp(opt_wpt_type, "mapnote")) {
-      wpt_type_num = 6;
-    } else if (!case_ignore_strcmp(opt_wpt_type, "circle")) {
-      wpt_type_num = 5;
-    } else if (!case_ignore_strcmp(opt_wpt_type, "image")) {
-      wpt_type_num = 18;
-    } else {
-      fatal(MYNAME ": wpt_type must be "
-            "symbol, text, mapnote, circle, or image\n");
-    }
-  }
-}
-
-static void
-Init_Output_Type()
-{
-  if (!output_type || !output_type[0]) {
-    output_type_num = last_read_type;
-    return;
-  }
-  if ((output_type[0] & 0xf0) == 0x30) {
-    output_type_num = atoi(output_type);
-  } else {
-    output_type_num = 0;
-    if (!case_ignore_strcmp(output_type, "drawing")) {
-      output_type_num = 0;
-    } else if (!case_ignore_strcmp(output_type, "road")) {
-      output_type_num = 1;
-    } else if (!case_ignore_strcmp(output_type, "trail")) {
-      output_type_num = 2;
-    } else if (!case_ignore_strcmp(output_type, "waypoint")) {
-      output_type_num = 3;
-    } else if (!case_ignore_strcmp(output_type, "track")) {
-      output_type_num = 4;
-    } else {
-      fatal(MYNAME ": type must be "
-            "drawing, road, trail, waypoint, or track\n");
-    }
-  }
-  last_read_type = output_type_num;
-}
-
-static long
-Parse_Change_Type(char* type)
-{
-  long retval = 0x11100541;
-
-  if (!case_ignore_strcmp(type, "limited")) {
-    retval = 0x11070430;
-  } else if (!case_ignore_strcmp(type, "toll")) {
-    retval = 0x11070470;
-  } else if (!case_ignore_strcmp(type, "us")) {
-    retval = 0x11070870;
-  } else if (!case_ignore_strcmp(type, "state")) {
-    retval = 0x11070c10;
-  } else if (!case_ignore_strcmp(type, "primary")) {
-    /* primary state/provincial routes */
-    retval = 0x11070840;
-  } else if (!case_ignore_strcmp(type, "major")) {
-    retval = 0x11070c30;
-  } else if (!case_ignore_strcmp(type, "local")) {
-    retval = 0x11071010;
-  } else if (!case_ignore_strcmp(type, "ramp")) {
-    retval = 0x11070cb0;
-  } else if (!case_ignore_strcmp(type, "ferry")) {
-    retval = 0x11070ca0;
-  } else if (!case_ignore_strcmp(type, "editable")) {
-    retval = 0x11100541;
-  } else {
-    fatal(MYNAME ": unknown road type for road changes\n");
-  }
-  return retval;
-}
-
-static void
-Free_Road_Changes()
-{
-  int i = 0;
-  if (roadchanges) {
-    while (roadchanges[i].name) {
-      xfree(roadchanges[i].name);
-      i++;
-    }
-    xfree(roadchanges);
-  }
-  roadchanges = nullptr;
-}
-
-static void
-Init_Road_Changes()
-{
-  int count = 0;
-  Free_Road_Changes();
-
-  if (!road_changes || !road_changes[0]) {
-    return;
-  }
-  char* bar = strchr(road_changes, '!');
-  while (bar) {
-    count++;
-    bar = strchr(bar+1, '!');
-  }
-  if (!(count&1)) {
-    fatal(MYNAME ": invalid format for road changes\n");
-  }
-  count = 1 + count / 2;
-  roadchanges = (roadchange*)xmalloc((count+1) * sizeof(roadchange));
-
-  roadchanges[count].type = 0;
-  roadchanges[count].name = nullptr;
-
-  char* copy = xstrdup(road_changes);
-  bar = copy;
-
-  while (count) {
-    count--;
-    char* name = bar;
-    bar = strchr(name, '!');
-    *bar = '\0';
-    bar++;
-    char* strType = bar;
-    bar = strchr(strType, '!');
-    if (bar) {
-      *bar = '\0';
-      bar++;
-    }
-    roadchanges[count].name = xstrdup(name);
-    roadchanges[count].type = Parse_Change_Type(strType);
-  }
-
-  xfree(copy);
-}
-
-static void
-rd_init(const QString& fname)
-{
-  infile = gbfopen_le(fname, "rb", MYNAME);
-}
-
-static void
-rd_deinit()
-{
-  gbfclose(infile);
-}
-
-static void
-my_read()
-{
-  Read_AN1_Header(infile);
-  Read_AN1_Bitmaps(infile);
-  Read_AN1_Waypoints(infile);
-  Read_AN1_Lines(infile);
-}
-
-static void
-wr_init(const QString& fname)
-{
-  outfile = gbfopen_le(fname, "wb", MYNAME);
-  Init_Output_Type();
-  Init_Road_Changes();
-  opt_color_num = color_to_bbggrr(opt_color);
-  Init_Wpt_Type();
-  if (opt_zoom) {
-    opt_zoom_num = atoi(opt_zoom);
-  }
-  radius = .1609344; /* 1/10 mi in kilometers */
-  if (opt_radius) {
-    radius = atof(opt_radius);
-    if (!strchr(opt_radius,'k') && !strchr(opt_radius,'K')) {
-      radius *= kKilometersPerMile;
-    }
-  }
-}
-
-static void
-wr_deinit()
-{
-  Free_Road_Changes();
-  gbfclose(outfile);
-}
-
-static void
-my_write()
-{
-  Write_AN1_Header(outfile);
-  Write_AN1_Bitmaps(outfile);
-  Write_AN1_Waypoints(outfile);
-  Write_AN1_Lines(outfile);
-}
-
-ff_vecs_t an1_vecs = {
-  ff_type_file,
-  {
-    (ff_cap)(ff_cap_read | ff_cap_write)       /* waypoints */,
-    ff_cap_write                       /* tracks */,
-    (ff_cap)(ff_cap_read | ff_cap_write)       /* routes */,
-  },
-  rd_init,
-  wr_init,
-  rd_deinit,
-  wr_deinit,
-  my_read,
-  my_write,
-  nullptr,
-  &an1_args,
-  CET_CHARSET_ASCII, 0 /* CET-REVIEW */
-  , NULL_POS_OPS,
-  nullptr
-};
diff --git a/an1sym.h b/an1sym.h
deleted file mode 100644 (file)
index df9bca6..0000000
--- a/an1sym.h
+++ /dev/null
@@ -1,734 +0,0 @@
-/*
-
-
-
-
-
-
-
-
-
-                       THIS FILE IS AUTOMATICALLY GENERATED
-
-
-                       Please change make-an1sym.pl and
-                       regenerate it rather than changing
-                       this file directly.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-*/
-
-/*
-    Read DeLorme drawing files (.an1) - supplemental (included by an1.c)
-
-    Copyright (C) 2005 Ron Parker and Robert Lipe.
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
- */
-
-static struct defguid {
-  guid_t guid;
-  const char* name;
-} default_guids[] = {
-  { {0xb610bc70,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Hiker"
-  },
-  { {0xb610bc71,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Canoe"
-  },
-  { {0xb610bc72,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Kayak"
-  },
-  { {0xb610bc73,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Bike"
-  },
-  { {0xb610bc74,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Four wheeler"
-  },
-  { {0xb610bc75,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Jeep"
-  },
-  { {0xb610bc76,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Snowmobile"
-  },
-  { {0xb610bc78,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Rec Vehicle"
-  },
-  { {0xb610bc79,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Fire"
-  },
-  { {0xb610bc7a,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Fishing"
-  },
-  { {0xb610bc7b,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Tree"
-  },
-  { {0xb610bc7c,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Pine Tree"
-  },
-  { {0xb610bc7d,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Birch"
-  },
-  { {0xb610bc7e,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Deer"
-  },
-  { {0xb610bc7f,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Moose"
-  },
-  { {0x99d8c163,{0x7622, 0x11d5, 0xe8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Mud"
-  },
-  { {0x012dfac2,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Tractor"
-  },
-  { {0x012dfac3,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Combine Harvester"
-  },
-  { {0x012dfac7,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Front-End Loader"
-  },
-  { {0xfd163780,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Power Shovel"
-  },
-  { {0xfd163781,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Road Grader"
-  },
-  { {0xfd163784,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Road Roller"
-  },
-  { {0xfd163787,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dump Truck"
-  },
-  { {0x5673d712,{0xb28d, 0x11d5, 0x13b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Skid-Steer Loader"
-  },
-  { {0xb86045ac,{0x390f, 0x420f, 0x91a7}, {0x76, 0x2f, 0x48, 0xea, 0xe2, 0xd7}},
-    "Highway Sign"
-  },
-  { {0x1e129e95,{0x13b6, 0x48d8, 0x3fa3}, {0x9c, 0xc8, 0x20, 0x8e, 0x1d, 0x9d}},
-    "Orange Cone"
-  },
-  { {0xadee7d54,{0xf7c9, 0x4ab6, 0xfb93}, {0x99, 0xc3, 0xbc, 0x9d, 0x15, 0x47}},
-    "Barricade"
-  },
-  { {0xa170000f,{0x8bd8, 0x4574, 0x58ac}, {0x55, 0x41, 0x67, 0xef, 0x64, 0x62}},
-    "Flagger"
-  },
-  { {0xa425f90e,{0x6ab6, 0x4ca9, 0x8997}, {0xbf, 0xca, 0xe0, 0xc2, 0x2b, 0x53}},
-    "Construction Sign"
-  },
-  { {0x0805b240,{0x6b26, 0x4300, 0xebb1}, {0xea, 0x9b, 0xcf, 0x68, 0xc6, 0x18}},
-    "Construction Flasher"
-  },
-  { {0x56721a6c,{0x8e77, 0x4b62, 0x09aa}, {0xce, 0xdc, 0x69, 0x4a, 0x16, 0x05}},
-    "Transit"
-  },
-  { {0x623e1ee9,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Arrow Left"
-  },
-  { {0x623e1eea,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Arrow Right"
-  },
-  { {0x623e1eeb,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Arrow Up"
-  },
-  { {0x623e1eec,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Arrow Down"
-  },
-  { {0x623e1eed,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Arrow Up Left"
-  },
-  { {0x623e1eee,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Arrow Up Right"
-  },
-  { {0x623e1eef,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Arrow Down Left"
-  },
-  { {0x623e1ef0,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Arrow Down Right"
-  },
-  { {0x83f91421,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Arrow Left"
-  },
-  { {0x83f91422,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Arrow Right"
-  },
-  { {0x83f91423,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Arrow Up"
-  },
-  { {0x83f91424,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Arrow Down"
-  },
-  { {0x83f91425,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Arrow Up Left"
-  },
-  { {0x83f91426,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Arrow Up Right"
-  },
-  { {0x83f91427,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Arrow Down Left"
-  },
-  { {0x83f91428,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Arrow Down Right"
-  },
-  { {0x83f91429,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Large Arrow Left"
-  },
-  { {0x83f9142a,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Large Arrow Right"
-  },
-  { {0x83f9142b,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Large Arrow Up"
-  },
-  { {0x83f9142c,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Large Arrow Down"
-  },
-  { {0x83f9142d,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Large Arrow Down Right"
-  },
-  { {0x83f9142e,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Large Arrow Down Left"
-  },
-  { {0x83f9142f,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Large Arrow Up Left"
-  },
-  { {0x83f91430,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Large Arrow Up Right"
-  },
-  { {0x8ff0aad1,{0xc53d, 0x4998, 0x7ebd}, {0x06, 0x60, 0x25, 0x6c, 0x4f, 0x6d}},
-    "Accommodation"
-  },
-  { {0xaf7bf199,{0x6a8b, 0x49fe, 0xae92}, {0xa3, 0x09, 0x7b, 0xb8, 0x81, 0x6a}},
-    "Australia"
-  },
-  { {0x6bbcc9d1,{0x6a19, 0x4c7b, 0xc6a2}, {0x3e, 0x17, 0x02, 0xd6, 0xee, 0x3a}},
-    "Blue Dome Cross"
-  },
-  { {0xfff920fe,{0xd780, 0x49d4, 0x1bad}, {0x55, 0x2e, 0xc7, 0xdf, 0xa2, 0xaa}},
-    "Green Dome Cross"
-  },
-  { {0x57e75924,{0xd6fa, 0x4666, 0x84bf}, {0x5b, 0x76, 0xa1, 0xd0, 0x14, 0x5f}},
-    "Business"
-  },
-  { {0xb09ef4a7,{0x95e4, 0x4e5e, 0x5e84}, {0xbe, 0x2b, 0x86, 0xdd, 0x50, 0x65}},
-    "Airplane"
-  },
-  { {0xf2833c22,{0x3592, 0x4a8a, 0x5693}, {0xee, 0x6c, 0x83, 0xb6, 0x3c, 0x19}},
-    "Amusement Recreation"
-  },
-  { {0x6f0317d6,{0x7fa3, 0x4dcc, 0x6187}, {0x7e, 0xca, 0xcb, 0x65, 0x49, 0x12}},
-    "Green Square"
-  },
-  { {0x18a6d3c0,{0x45cb, 0x4d19, 0xf5b9}, {0xc7, 0x9c, 0xbf, 0x8f, 0x6d, 0x46}},
-    "Red Triangle"
-  },
-  { {0x86e68ea7,{0xb9ab, 0x4bc8, 0xa1bf}, {0xc1, 0x22, 0x13, 0x97, 0x95, 0xe8}},
-    "Red Triangle and Green Square"
-  },
-  { {0x6afd74bf,{0x0ea5, 0x4680, 0xcd88}, {0x15, 0x87, 0x2f, 0x6c, 0xd2, 0xd8}},
-    "City 4"
-  },
-  { {0x49dfeb74,{0xbb09, 0x4df1, 0x5687}, {0xd8, 0xa0, 0xff, 0x36, 0x89, 0x3d}},
-    "White Square"
-  },
-  { {0x3eed62c6,{0xdab9, 0x42b0, 0xe4a3}, {0xd2, 0xf1, 0x7d, 0x54, 0xbf, 0x77}},
-    "White Triangle"
-  },
-  { {0x6b521940,{0x4492, 0x4c48, 0x58a0}, {0xfc, 0xd1, 0x1f, 0x5e, 0x0c, 0xea}},
-    "Red Black Diamond Flag"
-  },
-  { {0xbb8ebaa3,{0xac59, 0x4411, 0x9c94}, {0x30, 0xd4, 0xe1, 0x21, 0x25, 0x46}},
-    "Yellow Diamond Flag"
-  },
-  { {0x8e118862,{0xf6aa, 0x4b34, 0x2b82}, {0x8f, 0x3b, 0x5a, 0x2b, 0x59, 0xeb}},
-    "Small Pink Square"
-  },
-  { {0xd0ef64c2,{0xe319, 0x4876, 0x1b85}, {0x0e, 0x90, 0x50, 0x89, 0xb7, 0xc5}},
-    "Store"
-  },
-  { {0xa22b08fb,{0x6193, 0x4f5c, 0xdaa4}, {0xfa, 0xdf, 0xa7, 0x6e, 0x23, 0xe1}},
-    "Camping"
-  },
-  { {0x27f57c69,{0x575b, 0x4b56, 0x288c}, {0xe8, 0xe1, 0xc7, 0x05, 0x1f, 0x1f}},
-    "Green Diamond Flag"
-  },
-  { {0xe07abb38,{0x219f, 0x4b52, 0x868b}, {0x45, 0x0f, 0xbc, 0xc1, 0x4f, 0x6a}},
-    "Red Diamond Flag"
-  },
-  { {0x3a124ac9,{0x3973, 0x4e27, 0x4b82}, {0xa6, 0x3a, 0x94, 0x5c, 0xf8, 0xb3}},
-    "Red Green Diamond Flag"
-  },
-  { {0x64ed669b,{0x0db8, 0x4ec9, 0xd181}, {0x98, 0x50, 0xb3, 0x8b, 0x2f, 0x2e}},
-    "White Globe"
-  },
-  { {0x3cb10adc,{0xb090, 0x4960, 0x9f8a}, {0xec, 0xaf, 0x6c, 0xd7, 0xaa, 0x8b}},
-    "Yellow Globe"
-  },
-  { {0x2779347d,{0x17d4, 0x4021, 0xa6a8}, {0x51, 0x9a, 0xb6, 0xf8, 0x21, 0xff}},
-    ""
-  },
-  { {0x3ad63f7b,{0x4339, 0x427d, 0x5797}, {0xce, 0xa9, 0x96, 0x33, 0x8b, 0x3c}},
-    "Black Cross"
-  },
-  { {0x3e89481e,{0x35ff, 0x48b6, 0xc7ae}, {0xb0, 0x75, 0xf6, 0x43, 0xc4, 0xc7}},
-    "Church"
-  },
-  { {0x68622c10,{0x79b6, 0x466d, 0xa8a3}, {0x27, 0xc6, 0x25, 0x34, 0xfa, 0xa9}},
-    "Small Dark Green Square"
-  },
-  { {0x42c6a873,{0x2d0c, 0x46e7, 0x9989}, {0xdd, 0x86, 0x01, 0x6e, 0xa4, 0xc9}},
-    "Small Black Square"
-  },
-  { {0x50e3b06e,{0xbe81, 0x4b2c, 0x1f92}, {0x80, 0xa5, 0x72, 0x9b, 0x33, 0x05}},
-    "Danger"
-  },
-  { {0x369d0b22,{0xed07, 0x421f, 0x8780}, {0x33, 0x0e, 0xbd, 0x27, 0x4f, 0x3c}},
-    "Construction Business"
-  },
-  { {0x10603b6c,{0xb02e, 0x49ee, 0x60b9}, {0xed, 0x7e, 0x31, 0x16, 0x27, 0x89}},
-    "Airport"
-  },
-  { {0x8328aab7,{0xfe04, 0x46dc, 0x7bbf}, {0x29, 0x34, 0x30, 0xd3, 0x4d, 0xeb}},
-    "City 5"
-  },
-  { {0x96411287,{0xda33, 0x40e3, 0xaa9c}, {0x75, 0x83, 0x78, 0x2d, 0xa6, 0xf3}},
-    "USA"
-  },
-  { {0xb2f98627,{0x1211, 0x40e8, 0xb287}, {0x6d, 0x66, 0xfd, 0x15, 0x1e, 0xd4}},
-    "Diver Down"
-  },
-  { {0x3fce26d0,{0xfec6, 0x4f8b, 0x55a2}, {0x89, 0x3a, 0x8e, 0x59, 0x08, 0x0a}},
-    "Light Yellow Square"
-  },
-  { {0xb4b68597,{0x1aed, 0x4918, 0xd492}, {0x1f, 0xd1, 0x5e, 0xf2, 0x55, 0xc1}},
-    "Education Technology"
-  },
-  { {0x35d2e6a8,{0xda88, 0x4edb, 0x4b80}, {0x2b, 0x1b, 0xcf, 0xc0, 0xd4, 0x6d}},
-    "Computer"
-  },
-  { {0x4ddc4e96,{0x8d19, 0x4079, 0x4488}, {0xc0, 0x8f, 0x0f, 0x8e, 0xb5, 0xd7}},
-    "Amusement Recreation Red"
-  },
-  { {0x79f58929,{0x46c6, 0x4337, 0xc0b1}, {0xf0, 0x09, 0x55, 0xbb, 0x1f, 0xc3}},
-    "Telephone Red"
-  },
-  { {0x0083b377,{0xfb80, 0x4a83, 0x3593}, {0x56, 0xe5, 0xfe, 0xc4, 0xcd, 0x43}},
-    "Exit"
-  },
-  { {0x0c232891,{0xab4d, 0x440e, 0x7083}, {0x05, 0x63, 0x3a, 0xf5, 0x66, 0x11}},
-    "Exit with Services"
-  },
-  { {0xaf63e7c2,{0x03fa, 0x418e, 0xc68b}, {0x02, 0xb8, 0xf5, 0x61, 0xb6, 0x61}},
-    "Pizza"
-  },
-  { {0xd419c693,{0x39e6, 0x43db, 0xa1b8}, {0x7f, 0xcc, 0x2c, 0xb8, 0x51, 0x4a}},
-    "Financial Services"
-  },
-  { {0x70740a81,{0xe4ca, 0x4ac2, 0xa498}, {0x21, 0xc8, 0x5b, 0xc0, 0xb7, 0xae}},
-    "City 3"
-  },
-  { {0x9a582ff6,{0x34c4, 0x41c6, 0xf0a3}, {0x99, 0x69, 0x9d, 0xbe, 0x2e, 0x08}},
-    "Food Store"
-  },
-  { {0x3cd31689,{0x2f8f, 0x4fb0, 0xcb88}, {0x34, 0x84, 0xfc, 0x8b, 0x03, 0xe4}},
-    ""
-  },
-  { {0x952557a6,{0xe29e, 0x4512, 0x1184}, {0x1a, 0x3c, 0x9c, 0xd4, 0x83, 0x7d}},
-    ""
-  },
-  { {0x03dc278c,{0xe8ff, 0x46ac, 0x3daa}, {0x9f, 0xe9, 0x1e, 0xcf, 0x10, 0x35}},
-    "Driving Range"
-  },
-  { {0xacd28bab,{0x0ec0, 0x4393, 0xaf8b}, {0xbb, 0x5e, 0x74, 0xb3, 0x87, 0x12}},
-    "Golf Municipal"
-  },
-  { {0x984e7139,{0xeab8, 0x49f6, 0x55a0}, {0x8d, 0x51, 0xe6, 0xdd, 0xcc, 0xf4}},
-    "Golf Private"
-  },
-  { {0xec5828ab,{0x2a9d, 0x48f8, 0xd79b}, {0xc9, 0xc3, 0x30, 0x8e, 0xe4, 0xea}},
-    "Golf Public"
-  },
-  { {0xb0120d99,{0x683a, 0x4ecc, 0x129a}, {0x29, 0x94, 0x1f, 0x04, 0xae, 0x10}},
-    "Golf Resort"
-  },
-  { {0x2ce7685a,{0x6eaf, 0x4061, 0x29a5}, {0x87, 0x5e, 0xfa, 0x41, 0x75, 0x1a}},
-    "Golf Semi Private"
-  },
-  { {0x10397049,{0x9fc9, 0x4380, 0x5680}, {0x81, 0xd9, 0xe7, 0x43, 0x1f, 0x11}},
-    "Medical Service"
-  },
-  { {0x2fc28df6,{0xe806, 0x436e, 0xe0b9}, {0x46, 0x1d, 0xeb, 0xad, 0x56, 0x60}},
-    "Home Furnishings"
-  },
-  { {0x910313db,{0xafce, 0x4019, 0x1aa4}, {0xe6, 0x2c, 0xe6, 0xd1, 0xfd, 0xf7}},
-    "Industrial"
-  },
-  { {0x9e442c6e,{0xe12a, 0x4407, 0xd68a}, {0x1c, 0x5e, 0x19, 0xe7, 0xfe, 0x01}},
-    ""
-  },
-  { {0x37e2fe4a,{0xcd71, 0x413f, 0x0cad}, {0x81, 0xc5, 0x2c, 0xf4, 0x78, 0x79}},
-    ""
-  },
-  { {0x3c756e09,{0xb2dc, 0x48a6, 0x04a9}, {0x20, 0xb7, 0xc9, 0x9d, 0x14, 0x51}},
-    ""
-  },
-  { {0xa1245b1c,{0x156a, 0x48fc, 0x6f96}, {0xa5, 0xa3, 0x22, 0x54, 0x13, 0x97}},
-    "Manufacturing"
-  },
-  { {0x5bddbd7a,{0xf3cb, 0x454c, 0x06af}, {0x46, 0x1a, 0x68, 0xea, 0x60, 0x1a}},
-    "Note"
-  },
-  { {0xcb6777e1,{0xe0e0, 0x45ce, 0x309f}, {0x8d, 0x61, 0x7a, 0xd9, 0x89, 0xf5}},
-    "City"
-  },
-  { {0xbc168c08,{0x2b7f, 0x44be, 0x3883}, {0x81, 0x31, 0x4a, 0x09, 0xf5, 0x78}},
-    "Air Base"
-  },
-  { {0xa8857b0f,{0xfc3b, 0x4cd1, 0x9e91}, {0xf5, 0x3b, 0x21, 0xa8, 0x3b, 0xb9}},
-    "Battlefield"
-  },
-  { {0x06db55c1,{0xf687, 0x4840, 0x7c80}, {0x95, 0x58, 0x77, 0x8e, 0x5a, 0xdd}},
-    "Mining"
-  },
-  { {0xcc61b277,{0xa48c, 0x445a, 0xd9b9}, {0xe5, 0x91, 0x36, 0x18, 0x4e, 0x09}},
-    "Mountain"
-  },
-  { {0xfde13186,{0xb6cb, 0x4374, 0xc880}, {0x56, 0x99, 0xeb, 0x51, 0x68, 0x87}},
-    "Capital"
-  },
-  { {0xb14d90d1,{0xd943, 0x40ff, 0x9fb7}, {0x9b, 0x92, 0xd1, 0x23, 0xca, 0xef}},
-    "Route"
-  },
-  { {0x7eabc63f,{0x05d0, 0x4465, 0xb1b0}, {0x61, 0x2a, 0xf7, 0x4d, 0x0f, 0x4e}},
-    "Overnight"
-  },
-  { {0xac39d8b9,{0xfcdc, 0x4b50, 0x9ca6}, {0xea, 0x6c, 0x4b, 0xb5, 0x96, 0x0f}},
-    "Route End Active"
-  },
-  { {0xe1b9d86b,{0x95e6, 0x4bd8, 0xd880}, {0x7b, 0x6c, 0xc6, 0xd2, 0x00, 0x34}},
-    "Route End Inactive"
-  },
-  { {0x98712315,{0x7e1e, 0x4024, 0x8392}, {0xe3, 0xb8, 0x5a, 0x51, 0x45, 0xb4}},
-    "Fuel Stop"
-  },
-  { {0xe5ea5b38,{0x7b80, 0x4b42, 0x0aba}, {0x3d, 0x38, 0xf0, 0xe1, 0x17, 0x9a}},
-    "Route Start Active"
-  },
-  { {0x18fd0d49,{0x0a29, 0x433a, 0xd584}, {0xe5, 0xb7, 0x5b, 0xe8, 0x25, 0xbc}},
-    "Route Start Inactive"
-  },
-  { {0x2f52144b,{0x903e, 0x4dd9, 0x79af}, {0xe1, 0x66, 0x9b, 0xfc, 0xa9, 0xc1}},
-    "Route Stop Active"
-  },
-  { {0xfaf8d826,{0xd27d, 0x4316, 0x0e92}, {0xce, 0x8d, 0x85, 0x93, 0x4c, 0xf5}},
-    "Route Stop Inactive"
-  },
-  { {0xff44cae2,{0x707c, 0x4a1c, 0x43af}, {0x8b, 0xb6, 0xb1, 0x19, 0x9c, 0xf2}},
-    "Route Via"
-  },
-  { {0x5a50d59b,{0xc15b, 0x49c4, 0x9faa}, {0xc4, 0x1c, 0x4f, 0xe2, 0x95, 0x2a}},
-    "Radiation Green"
-  },
-  { {0x19556023,{0xb1e5, 0x4c9c, 0x49ba}, {0x08, 0x52, 0xa1, 0x24, 0x3d, 0x9f}},
-    "Radiation Red"
-  },
-  { {0xa54be251,{0x6688, 0x49fb, 0x60b3}, {0x89, 0x56, 0x37, 0x68, 0xc5, 0xb0}},
-    "Electricity"
-  },
-  { {0xd793ff0c,{0xfbe0, 0x4383, 0x3183}, {0xcf, 0x4f, 0x04, 0xb7, 0xee, 0x0a}},
-    "Personal Furnishings"
-  },
-  { {0x00f90733,{0x7ab5, 0x42cf, 0x468c}, {0xbf, 0x91, 0x27, 0xd3, 0xa8, 0x9c}},
-    "Personal Services"
-  },
-  { {0xea677f24,{0xbbe8, 0x4238, 0xee9c}, {0x6c, 0x0a, 0xec, 0x0e, 0x34, 0xf4}},
-    "Telephone Black"
-  },
-  { {0x2d8a05b5,{0x8baf, 0x4f28, 0xf58b}, {0xfb, 0x7f, 0x37, 0x34, 0x28, 0xa7}},
-    "Government Light"
-  },
-  { {0x40c64dfc,{0xc2d0, 0x4b0e, 0x6582}, {0x3f, 0x26, 0x9c, 0xcb, 0x6f, 0x1d}},
-    "Airport Red Square"
-  },
-  { {0xf27adb5d,{0x3629, 0x44c7, 0x95a2}, {0x25, 0x2c, 0x95, 0x24, 0x98, 0x2f}},
-    "Propeller Aircraft"
-  },
-  { {0x5a718e13,{0x3547, 0x42c5, 0x6d9d}, {0xb2, 0x82, 0xa5, 0x53, 0xbd, 0x3a}},
-    "Jet Aircraft"
-  },
-  { {0x0a471039,{0x2dfe, 0x447e, 0x54be}, {0xa3, 0x93, 0xae, 0x9a, 0xdd, 0xac}},
-    "Government"
-  },
-  { {0x4a59da2f,{0xe1c3, 0x42c3, 0x6ca1}, {0x06, 0xb9, 0x14, 0x1b, 0x89, 0x99}},
-    "USA Regional"
-  },
-  { {0xf16500a9,{0xa845, 0x4293, 0xae89}, {0x5c, 0x29, 0xbb, 0x0d, 0x06, 0xf7}},
-    "House 2"
-  },
-  { {0x7b05524d,{0xcb5a, 0x456f, 0x96b3}, {0x03, 0x61, 0x24, 0x54, 0x6a, 0x54}},
-    "Picnic"
-  },
-  { {0xb88ad7a1,{0xb94d, 0x42e8, 0x2b9d}, {0xf5, 0x4c, 0x2b, 0xff, 0x57, 0xdc}},
-    "Restaurant"
-  },
-  { {0xdc48a20a,{0x54a2, 0x4c61, 0x1fbe}, {0x02, 0x74, 0x5b, 0xe9, 0x18, 0x99}},
-    "Store 2"
-  },
-  { {0x6b5ab040,{0x96df, 0x46ae, 0xacb8}, {0xe4, 0x47, 0x66, 0x3f, 0xec, 0x9b}},
-    ""
-  },
-  { {0x153b2cff,{0x6232, 0x4294, 0xd59a}, {0xc5, 0xa0, 0x7b, 0xe0, 0x16, 0xeb}},
-    "Blue Star"
-  },
-  { {0xf276f6b3,{0x586a, 0x4bf8, 0x2f82}, {0xf2, 0x69, 0xe3, 0x76, 0x7e, 0xd5}},
-    ""
-  },
-  { {0x91d242c8,{0x0986, 0x4fad, 0x8286}, {0xec, 0x79, 0x79, 0xcd, 0xab, 0x02}},
-    "Running"
-  },
-  { {0x8b0078db,{0x6ee0, 0x4caa, 0xd3b5}, {0xfe, 0xe1, 0xc2, 0xbf, 0x94, 0x7d}},
-    "Transportation"
-  },
-  { {0x0599f6c9,{0x478e, 0x4f63, 0x78a5}, {0xed, 0x31, 0xb5, 0xae, 0xda, 0x89}},
-    "Fishing 2"
-  },
-  { {0x7389128c,{0x0e78, 0x4d5d, 0x4189}, {0xb8, 0xf3, 0xb5, 0xbd, 0x70, 0xb1}},
-    "Automotive"
-  },
-  { {0x0362b593,{0x3df6, 0x48ed, 0xc489}, {0x85, 0x13, 0xc1, 0xc0, 0xb9, 0x0d}},
-    "Cloudy"
-  },
-  { {0xf0717a94,{0xd048, 0x4770, 0x9bab}, {0x80, 0x09, 0xbd, 0x4b, 0x1e, 0x75}},
-    "Partly Cloudy"
-  },
-  { {0x14486bbc,{0xae6b, 0x44ea, 0xd6b9}, {0xbf, 0x9a, 0x39, 0x7a, 0x51, 0x6c}},
-    "Mostly Cloudy"
-  },
-  { {0x7a258c70,{0xabec, 0x4cff, 0x4983}, {0x84, 0xdc, 0x2f, 0x2e, 0xff, 0x28}},
-    "Hurricane"
-  },
-  { {0xeff260d4,{0x46d5, 0x4fb5, 0xc79c}, {0x5e, 0x06, 0xc8, 0xab, 0x7a, 0x2b}},
-    "Lightning"
-  },
-  { {0xc3d70220,{0x5154, 0x4766, 0xf0af}, {0xdf, 0x86, 0x74, 0x40, 0x5f, 0x8c}},
-    "Rain"
-  },
-  { {0xf2dfbc91,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Blue Flag"
-  },
-  { {0xf2dfbc92,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dark Blue Flag"
-  },
-  { {0xf2dfbc93,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Brown Flag"
-  },
-  { {0xf2dfbc94,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Yellow Flag"
-  },
-  { {0xf2dfbc95,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Red Flag 2"
-  },
-  { {0xf2dfbc96,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dark Red Flag"
-  },
-  { {0xf2dfbc97,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dark Green Flag"
-  },
-  { {0xf2dfbc98,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Green Flag"
-  },
-  { {0xf2dfbc99,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Blue-Green Flag"
-  },
-  { {0xf2dfbc9a,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Light Blue Flag"
-  },
-  { {0x623e1ee1,{0xaf27, 0x100f, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Dark Blue Map Pin"
-  },
-  { {0xf2dfbc9d,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Blue Map Pin"
-  },
-  { {0xf2dfbc9e,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Yellow Map Pin"
-  },
-  { {0xf2dfbc9f,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Brown Map Pin"
-  },
-  { {0xf2dfbca0,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Red Map Pin"
-  },
-  { {0xf2dfbca1,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dark Red Map Pin"
-  },
-  { {0xf2dfbca2,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Green Map Pin"
-  },
-  { {0xf2dfbca3,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dark Green Map Pin"
-  },
-  { {0xf2dfbca4,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Gray Map Pin"
-  },
-  { {0xf2dfbca5,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dark Gray Map Pin"
-  },
-  { {0xd1703de0,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Green Dot"
-  },
-  { {0xd1703de1,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dark Green Dot"
-  },
-  { {0xd1703de2,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Blue Dot"
-  },
-  { {0xd1703de3,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dark Blue Dot"
-  },
-  { {0xd1703de5,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Red Dot"
-  },
-  { {0x45c088e0,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Dark Red Dot"
-  },
-  { {0x45c088e1,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Yellow Dot"
-  },
-  { {0x45c088e2,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Brown Dot"
-  },
-  { {0x45c088e3,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Light Blue Dot"
-  },
-  { {0xbde3a8a1,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Blue-Green Dot"
-  },
-  { {0xbde3a8a2,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Green Dot"
-  },
-  { {0xbde3a8a3,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Dark Green Dot"
-  },
-  { {0xbde3a8a4,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Blue Dot"
-  },
-  { {0xbde3a8a5,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Dark Blue Dot"
-  },
-  { {0xbde3a8a6,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Red Dot"
-  },
-  { {0xbde3a8a7,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Dark Red Dot"
-  },
-  { {0xbde3a8a8,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Yellow Dot"
-  },
-  { {0xbde3a8a9,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Brown Dot"
-  },
-  { {0xbde3a8aa,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Light Blue Dot"
-  },
-  { {0xbde3a8ab,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
-    "Small Blue-Green Dot"
-  },
-  { {0x623e1ee0,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Red Flag"
-  },
-  { {0x623e1ee1,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Map Pin"
-  },
-  { {0x623e1ee2,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Yellow Square"
-  },
-  { {0x623e1ee3,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Red X"
-  },
-  { {0x623e1ee4,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Blue Circle"
-  },
-  { {0x623e1ee5,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "House"
-  },
-  { {0x623e1ee7,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Triangle"
-  },
-  { {0x623e1ee8,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
-    "Green Star"
-  },
-  { {0x9d277805,{0xe2f8, 0x4f43, 0x3f97}, {0x35, 0x0d, 0x40, 0xae, 0x5c, 0xd3}},
-    "Geocache"
-  },
-  { {0xcb8aad04,{0xcc2d, 0x47f2, 0x428a}, {0x80, 0xf7, 0xd6, 0x68, 0xed, 0x32}},
-    "Geocache Found"
-  },
-  { {0x7341c1f4,{0xdecd, 0x4d35, 0x45a5}, {0x52, 0x25, 0x5e, 0xbf, 0xe6, 0x51}},
-    "Tent"
-  },
-  { {0x835b84e2,{0xf10c, 0x45cb, 0x958f}, {0x18, 0x3a, 0xc2, 0x2a, 0xe5, 0x28}},
-    "Tipup Up"
-  },
-  { {0xce06fc92,{0xbb0c, 0x4ec1, 0xda93}, {0x64, 0x4a, 0x60, 0xbe, 0x40, 0x90}},
-    "Topup Down"
-  },
-};
-
-static int FindIconByName(const char* name, guid_t* guid)
-{
-  for (unsigned int i = 0; i < (sizeof(default_guids)/sizeof(struct defguid)); ++i) {
-    if (!case_ignore_strcmp(name, default_guids[i].name)) {
-      *guid = default_guids[i].guid;
-      return 1;
-    }
-  }
-  return 0;
-}
-
-static int FindIconByGuid(const guid_t* guid, const char** name)
-{
-  for (unsigned int i = 0; i < (sizeof(default_guids)/sizeof(struct defguid)); ++i) {
-    /* don't compare any structure padding */
-    if ((guid->l == default_guids[i].guid.l) &&
-        memcmp(guid->s, default_guids[i].guid.s, sizeof(guid->s)) &&
-        memcmp(guid->c, default_guids[i].guid.c, sizeof(guid->c))) {
-      *name = default_guids[i].name;
-      return 1;
-    }
-  }
-  return 0;
-}
diff --git a/deprecated/alan.cc b/deprecated/alan.cc
new file mode 100644 (file)
index 0000000..5efe64d
--- /dev/null
@@ -0,0 +1,994 @@
+/*
+
+    Read/write Alan Map500 Waypoints, Routes and Tracklogs.
+
+    Provides "alanwpr" and "alantrl" formats for gpsbabel.
+    Currently supports OS 2.xx only.
+
+    Copyright (C) 2007  Gunar Megger, 0xff@quantentunnel.de
+    Copyright (C) 2002-2014 Robert Lipe, robertlipe+source@gpsbabel.org
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+ */
+
+#include <cctype>                  // for isprint
+#include <cstdio>                  // for snprintf, sprintf, SEEK_SET, size_t
+#include <cstdint>                 // for int16_t, int32_t, uint8_t, uint32_t, uint16_t, int8_t
+#include <cstring>                 // for memset, strlen, strncpy, memcpy, strncmp
+#include <ctime>                   // for gmtime, time, time_t
+
+#include <QtCore/QString>          // for QString
+#include <QtCore/QVector>          // for QVector
+
+#include "defs.h"
+#include "gbfile.h"                // for gbfwrite, gbfile, gbfread, gbfclose, gbfopen, gbfseek
+#include "src/core/datetime.h"     // for DateTime
+
+#define MYNAME "alan"
+
+#define MAXWPT      1000               /* old 500 */
+
+#define MAXRTE      50                 /* old 20 */
+#define MAXWPTINRTE 150                        /* old 30 */
+
+#define MAXTRK      8                  /* old 5 */
+#define MAXPTINTRK  2500
+
+#define WPT_NAME_LEN    8
+#define WPT_COMMENT_LEN 12
+
+#define RTE_NAME_LEN    8
+#define RTE_COMMENT_LEN 12
+
+#define TRK_NAME_LEN    12
+#define TRK_COMMENT_LEN 13
+
+struct wpthdr {
+  uint32_t id;
+  int16_t num;
+  int16_t next;
+  int16_t idx[MAXWPT];
+  uint8_t used[MAXWPT];
+};
+
+struct wpt {
+  char name[WPT_NAME_LEN];
+  char comment[WPT_COMMENT_LEN];
+  struct {
+    int32_t x;                         /* degree * 36000 */
+    int32_t y;                         /* degree * 36000  */
+  } pt;
+  int32_t date;
+  int32_t time;
+  int16_t usecount;
+  int8_t checked;
+  int8_t reserved;
+};
+
+struct rtehdr {
+  uint32_t id;
+  int16_t num;
+  int16_t next;
+  int16_t idx[MAXRTE];
+  uint8_t used[MAXRTE];
+  int16_t rteno;
+};
+
+struct rte {
+  char name[RTE_NAME_LEN];
+  char comment[RTE_COMMENT_LEN];
+  int16_t wptnum;
+  int16_t wptidx[MAXWPTINRTE];
+  int16_t reserved;
+  int32_t date;
+  int32_t time;
+};
+
+struct wprdata {
+  struct wpthdr wpthdr;
+  struct wpt    wpt[MAXWPT];
+  struct rtehdr rtehdr;
+  struct rte    rte[MAXRTE];
+};
+
+struct trkhdr {
+  int16_t totalpt;
+  int16_t next;
+  char name[TRK_NAME_LEN];             /* 10, null terminated */
+  char comment[TRK_COMMENT_LEN];       /* 12, null terminated */
+  uint8_t reserved[3];
+  uint32_t occupied;
+  uint32_t show;
+  uint32_t fill;
+};
+
+struct loghdr {
+  uint32_t id;
+  int16_t num;
+  int16_t next;
+  int32_t date;
+  int32_t time;
+  struct trkhdr trkhdr[MAXTRK];
+};
+
+struct trklog {
+  struct {
+    int32_t x;                         /* degree * 36000 */
+    int32_t y;                         /* degree * 36000  */
+  } pt[MAXPTINTRK];
+  struct {
+    int16_t speed;                     /* km/h * 200 */
+    int16_t height;                    /* m * 5 */
+  } sh[MAXPTINTRK];
+};
+
+struct trldata {
+  struct loghdr loghdr;
+  struct trklog trklog[MAXTRK];
+};
+
+#define WPT_HDR_ID 0x5C38A600
+#define RTE_HDR_ID 0xD87F5900
+#define TRL_HDR_ID 0x38CB1200
+
+#define WPT_IDX_NONE -1                        /* 0xffff */
+#define WPT_USED      0xff
+#define WPT_UNUSED    0
+#define WPT_CHECKED   1
+#define WPT_UNCHECKED 0
+
+#define RTE_IDX_NONE   -1              /* 0xffff */
+#define RTE_USED        0xff
+#define RTE_UNUSED      0
+#define RTE_RTENO_NONE -1
+
+#define TRK_USED     1
+#define TRK_UNUSED   0
+#define TRK_SHOW     1
+#define TRK_HIDE     0
+#define TRK_FILL     1
+#define TRK_WRAP     0
+
+#define MAP500_PT_SCALE 36000.0
+#define pt2deg(P) ((double)(P) / MAP500_PT_SCALE)
+#define deg2pt(D) (int32_t)si_round((double)(D) * MAP500_PT_SCALE)
+
+#define MAP500_ALTITUDE_SCALE   5.0
+#define hgt2m(A) ((double)(A) / MAP500_ALTITUDE_SCALE)
+#define m2hgt(A) (int16_t)si_round((double)(A) * MAP500_ALTITUDE_SCALE)
+
+#define MAP500_SPEED_SCALE    720.0
+#define sp2mps(S) ((double)(S) / MAP500_SPEED_SCALE)
+#define mps2sp(S) (int16_t)si_round((double)(S) * MAP500_SPEED_SCALE)
+
+#define  BYTEORDER_TEST  0x04030201    /* 32bit reference value */
+enum {
+  SWAP_NONE  = 0x1234,                 /* map500 regular */
+  SWAP_BYTES = 0x2143,                 /* bytes swapped */
+  SWAP_WORDS = 0x3412,                 /* words swapped */
+  SWAP_BOTH  = 0x4321                  /* words + bytes swapped */
+};
+
+/**************************************************************************/
+
+static gbfile* fin = nullptr, *fout = nullptr;
+static struct wprdata WPR;
+static struct trldata TRL;
+
+static QVector<arglist_t> wpr_args = {
+  /*
+  {"os3", &osversion, "Operating system version 3",
+          NULL, ARGTYPE_BOOL, ARGNOMINMAX },
+  */
+};
+static QVector<arglist_t> trl_args = {
+  /*
+  {"os3", &osversion, "Operating system version 3",
+          NULL, ARGTYPE_BOOL, ARGNOMINMAX },
+  */
+};
+
+/**************************************************************************/
+// FIXME: Why is this code doing its own byte order conversion?
+static unsigned int byte_order()
+{
+  // avoid cppcheck error: The address of local variable 'test' is accessed at non-zero index.
+  // avoid undefined behavior accessing inactive union member.
+  // avoid  "strict aliasing" warnings.
+  // see https://en.cppreference.com/w/cpp/language/reinterpret_cast#Notes
+  uint32_t test = BYTEORDER_TEST;
+  unsigned char ptr[4];
+
+  static_assert(sizeof ptr == sizeof test, "byte order test construction failure.");
+  memcpy(&ptr[0], &test, sizeof test);
+
+  unsigned int order = (ptr[0] << 12) | (ptr[1] << 8) | (ptr[2] << 4) | ptr[3];
+
+  return order;
+}
+
+static void sw_bytes(void* word)
+{
+  auto* p = (uint8_t*) word;
+  auto* r = (uint16_t*) word;
+
+  *r = (uint16_t)(p[1] << 8 | p[0]);
+}
+static void sw_words(void* dword)
+{
+  auto* p = (uint16_t*) dword;
+  auto* r = (uint32_t*) dword;
+
+  *r = (uint32_t)(p[0] << 16 | p[1]);
+}
+static void rev_bytes(void* dword)
+{
+  auto* p = (uint8_t*) dword;
+  auto* r = (uint32_t*) dword;
+
+  *r = (uint32_t)(p[3] << 24 | p[2] << 16 | p[1] << 8 | p[0]);
+}
+
+static void swap_wpthdr(struct wpthdr* wpthdr,
+                        void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+  if (swap32_func != nullptr) {
+    swap32_func(&wpthdr->id);
+  }
+  if (swap16_func != nullptr) {
+    swap16_func(&wpthdr->num);
+    swap16_func(&wpthdr->next);
+    for (short &i : wpthdr->idx) {
+      swap16_func(&i);
+    }
+  }
+}
+
+static void swap_wpt(struct wpt* wpt,
+                     void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+  if (swap16_func != nullptr) {
+    swap16_func(&wpt->usecount);
+  }
+  if (swap32_func != nullptr) {
+    swap32_func(&wpt->pt.x);
+    swap32_func(&wpt->pt.y);
+    swap32_func(&wpt->date);
+    swap32_func(&wpt->time);
+  }
+}
+
+static void swap_rtehdr(struct rtehdr* rtehdr,
+                        void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+  if (swap16_func != nullptr) {
+    swap16_func(&rtehdr->num);
+    swap16_func(&rtehdr->next);
+    for (short &i : rtehdr->idx) {
+      swap16_func(&i);
+    }
+    swap16_func(&rtehdr->rteno);
+  }
+  if (swap32_func != nullptr) {
+    swap32_func(&rtehdr->id);
+  }
+}
+
+static void swap_rte(struct rte* rte,
+                     void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+  if (swap16_func != nullptr) {
+    swap16_func(&rte->wptnum);
+    for (short &i : rte->wptidx) {
+      swap16_func(&i);
+    }
+    swap16_func(&rte->reserved);
+  }
+  if (swap32_func != nullptr) {
+    swap32_func(&rte->date);
+    swap32_func(&rte->time);
+  }
+}
+
+static void wpr_swap(struct wprdata* wprdata)
+{
+  void (*swap16_func)(void*);
+  void (*swap32_func)(void*);
+  int i;
+
+  switch (byte_order()) {
+  case SWAP_NONE:                 /* same byte oder, LITTLE_ENDIAN */
+    return;
+    break;
+  case SWAP_BOTH:                 /* swap words and bytes, BIG_ENDIAN */
+    swap16_func = sw_bytes;
+    swap32_func = rev_bytes;
+    break;
+  case SWAP_WORDS:                /* swap words, PDP_ENDIAN */
+    swap16_func = nullptr;
+    swap32_func = sw_words;
+    break;
+  case SWAP_BYTES:                /* swap bytes */
+    swap16_func = sw_bytes;
+    swap32_func = nullptr;
+    break;
+  default:
+    return;                       /* never reached */
+  }
+
+  swap_wpthdr(&(wprdata->wpthdr), swap16_func, swap32_func);
+  for (i=0; i< MAXWPT; i++) {
+    swap_wpt(&(wprdata->wpt[i]), swap16_func, swap32_func);
+  }
+  swap_rtehdr(&(wprdata->rtehdr), swap16_func, swap32_func);
+  for (i=0; i<MAXRTE; i++) {
+    swap_rte(&(wprdata->rte[i]), swap16_func, swap32_func);
+  }
+}
+
+static void swap_trkhdr(struct trkhdr* trkhdr,
+                        void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+  if (swap16_func != nullptr) {
+    swap16_func(&(trkhdr->totalpt));
+    swap16_func(&(trkhdr->next));
+  }
+  if (swap32_func != nullptr) {
+    swap32_func(&(trkhdr->occupied));
+    swap32_func(&(trkhdr->show));
+    swap32_func(&(trkhdr->fill));
+  }
+}
+
+static void swap_loghdr(struct loghdr* loghdr,
+                        void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+  if (swap16_func != nullptr) {
+    swap16_func(&(loghdr->num));
+    swap16_func(&(loghdr->next));
+  }
+  if (swap32_func != nullptr) {
+    swap32_func(&(loghdr->id));
+    swap32_func(&(loghdr->date));
+    swap32_func(&(loghdr->time));
+  }
+  for (auto &i : loghdr->trkhdr) {
+    swap_trkhdr(&i, swap16_func, swap32_func);
+  }
+}
+
+static void swap_trklog(struct trklog* trklog,
+                        void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+  int i;
+
+  if (swap16_func != nullptr) {
+    for (i=0; i<MAXPTINTRK; i++) {
+      swap16_func(&(trklog->sh[i].speed));
+      swap16_func(&(trklog->sh[i].height));
+    }
+  }
+  if (swap32_func != nullptr) {
+    for (i=0; i<MAXPTINTRK; i++) {
+      swap32_func(&(trklog->pt[i].x));
+      swap32_func(&(trklog->pt[i].y));
+    }
+  }
+}
+
+static void trl_swap(struct trldata* trldata)
+{
+  void (*swap16_func)(void*);
+  void (*swap32_func)(void*);
+
+  switch (byte_order()) {
+  case SWAP_NONE:                 /* same byte oder, LITTLE_ENDIAN */
+    return;
+    break;
+  case SWAP_BOTH:                 /* swap words and bytes, BIG_ENDIAN */
+    swap16_func = sw_bytes;
+    swap32_func = rev_bytes;
+    break;
+  case SWAP_WORDS:                /* swap words, PDP_ENDIAN */
+    swap16_func = nullptr;
+    swap32_func = sw_words;
+    break;
+  case SWAP_BYTES:                /* swap bytes */
+    swap16_func = sw_bytes;
+    swap32_func = nullptr;
+    break;
+  default:
+    return;                        /* never reached */
+  }
+
+  swap_loghdr(&(trldata->loghdr), swap16_func, swap32_func);
+  for (auto &i : trldata->trklog) {
+    swap_trklog(&i, swap16_func, swap32_func);
+  }
+}
+
+
+/**************************************************************************/
+
+static void str2lab(char* dest, const char* src, int len, const char* fmt,
+                    int n)
+{
+  int j = 0;
+  if (src != nullptr) {
+    for (int i=0; i<len && src[i] != '\0'; i++) {
+      if (isprint(src[i])) {
+        dest[j++] = src[i];
+      }
+    }
+  }
+  if (j == 0 && fmt != nullptr) {
+    snprintf(dest, len, fmt, n);
+    j = strlen(dest);
+  }
+  if (j < len) {
+    memset(dest+j, ' ', len-j);
+  }
+}
+
+static void str2lab(char* dest, const QString& src, int len, const char* fmt,
+                    int n)
+{
+  str2lab(dest, CSTR(src), len, fmt, n);
+}
+
+static void pack_time(time_t t, int32_t* date, int32_t* time)
+{
+  struct tm* tm = gmtime(&t);
+  *date = tm->tm_mday | ((tm->tm_mon+1)<<8) | ((tm->tm_year+1900)<<16);
+  *time = t % 86400;
+}
+
+static time_t unpack_time(int32_t date, int32_t time)
+{
+  static int m_to_d[12] =
+  {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
+
+  short year = (date >> 16) & 0xffff;
+  short month = (date >> 8) & 0xff;    /* 1-12 */
+  short day = date & 0xff;          /* 1-31 */
+
+  month -= 1;                  /* fit struct tm */
+  year += month / 12;
+
+  if (month < 0) {
+    year -= 1;
+    month += 12;
+  }
+  time_t result = (year - 1970) * 365 + m_to_d[month];
+  if (month <= 1) {
+    year -= 1;
+  }
+  result += (year - 1968) / 4;
+  result -= (year - 1900) / 100;
+  result += (year - 1600) / 400;
+  result += day;
+  result -= 1;
+  result *= 86400;
+  result += time;           /* map500 time is inseconds of the day */
+
+  return result;
+}
+
+/**************************************************************************/
+
+static Waypoint* get_wpt(struct wprdata* wprdata, unsigned n)
+{
+  int j;
+
+  struct wpthdr* wpthdr = &(wprdata->wpthdr);
+  int idx = wpthdr->idx[n];
+
+  if (idx == WPT_IDX_NONE || wpthdr->used[idx] == WPT_UNUSED) {
+    return nullptr;
+  }
+  struct wpt* wpt = &(wprdata->wpt[idx]);
+
+  auto* WP = new Waypoint;
+  WP->latitude  = -pt2deg(wpt->pt.y);
+  WP->longitude =  pt2deg(wpt->pt.x);
+  WP->SetCreationTime(unpack_time(wpt->date, wpt->time));
+  for (j=WPT_NAME_LEN-1; j >= 0 && wpt->name[j] == ' '; j--) {}
+  char *s = xstrndup(wpt->name,j+1);
+  WP->shortname = s;
+  xfree(s);
+  for (j=WPT_COMMENT_LEN-1; j >= 0 && wpt->comment[j] == ' '; j--) {}
+  if (j >= 0) {
+    char *descr = xstrndup(wpt->comment, j+1);
+    WP->description = descr;
+    xfree(descr);
+  } else {
+    WP->description = "";
+  }
+  WP->notes = "";
+
+  return WP;
+}
+
+static void wpr_read()
+{
+  struct wprdata wprdata;
+  int i, j;
+  Waypoint* WP;
+
+  if (gbfread(&wprdata, sizeof(struct wprdata), 1, fin) != 1) {
+    fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file\n", fin->name);
+  }
+  wpr_swap(&wprdata);
+  if (wprdata.wpthdr.id != WPT_HDR_ID ||
+      wprdata.rtehdr.id != RTE_HDR_ID) {
+    fatal(MYNAME ": %s is not in Alan .wpr format.\n", fin->name);
+  }
+
+  /* waypoints */
+  for (i=0; i<MAXWPT; i++) {
+    WP = get_wpt(&wprdata, i);
+    if (WP != nullptr) {
+      waypt_add(WP);
+    }
+  }
+
+  /* routes */
+  struct rtehdr* rtehdr = &(wprdata.rtehdr);
+  for (i=0; i<MAXRTE; i++) {
+    int idx = rtehdr->idx[i];
+    if (idx == RTE_IDX_NONE || rtehdr->used[idx] == RTE_UNUSED) {
+      continue;
+    }
+    struct rte* rte = &(wprdata.rte[idx]);
+
+    auto* RT = new route_head;
+    RT->rte_num = i;
+    for (j=RTE_NAME_LEN-1; j >= 0 && rte->name[j] == ' '; j--) {}
+    char *s = xstrndup(rte->name,j+1);
+    RT->rte_name = s;
+    xfree(s);
+    for (j=RTE_COMMENT_LEN-1; j >= 0 && rte->comment[j] == ' '; j--) {}
+    if (j >= 0) {
+      char *desc = xstrndup(rte->comment,j+1);
+      RT->rte_desc = desc;
+      xfree(desc);
+    } else {
+      RT->rte_desc = "";
+    }
+
+    route_add_head(RT);
+
+    /* route points */
+    for (j=0; j<rte->wptnum; j++) {
+      WP = get_wpt(&wprdata, rte->wptidx[j]);
+      if (WP != nullptr) {
+        route_add_wpt(RT, WP);
+      }
+    }
+  }
+}
+
+static void trl_read()
+{
+  struct trldata trldata;
+  int i, j;
+
+  for (i=0; i<MAXTRK; i+=2) {
+    gbfseek(fin, 0x10000 * (i/2), SEEK_SET);
+    if (gbfread(&(trldata.trklog[i]), sizeof(struct trklog), 2, fin) != 2) {
+      fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file.\n", fin->name);
+    }
+  }
+  gbfseek(fin, 0x10000 * MAXTRK/2, SEEK_SET);
+  if (gbfread(&(trldata.loghdr), sizeof(struct loghdr), 1, fin) != 1) {
+    fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file.\n", fin->name);
+  }
+  trl_swap(&trldata);
+  if (trldata.loghdr.id != TRL_HDR_ID) {
+    fatal(MYNAME ": %s is not in Alan .trl format.\n", fin->name);
+  }
+
+  for (i=0; i<MAXTRK; i++) {
+    /* track header */
+    struct trkhdr* trkhdr = &(trldata.loghdr.trkhdr[i]);
+    if (trkhdr->occupied == TRK_UNUSED) {
+      continue;
+    }
+    auto* TL = new route_head;
+    for (j=TRK_NAME_LEN-1;
+         j >= 0 && (trkhdr->name[j] == ' ' || trkhdr->name[j] == '\0');
+         j--) {}
+    char *s1 = xstrndup(trkhdr->name,j+1);
+    TL->rte_name = s1;
+    xfree(s1);
+    /*  TL->rte_name[TRK_NAME_LEN+1] = 0; */   /* MAYBE BAD ADDRESS (Valgrind) */
+    for (j=TRK_COMMENT_LEN-1;
+         j >= 0 && (trkhdr->comment[j] == ' ' || trkhdr->comment[j] == '\0');
+         j--) {}
+    s1 = xstrndup(trkhdr->comment,j+1);
+    TL->rte_desc = s1;
+    xfree(s1);
+    /*  TL->rte_desc[TRK_COMMENT_LEN+1] = 0; */        /* MAYBE BAD ADDRESS (Valgrind) */
+    TL->rte_num = i;
+
+    track_add_head(TL);
+
+    /* track points */
+    struct trklog* trklog = &(trldata.trklog[i]);
+    for (j=0; j<trkhdr->totalpt; j++) {
+      auto* WP = new Waypoint;
+      WP->latitude  = -pt2deg(trklog->pt[j].y);
+      WP->longitude =  pt2deg(trklog->pt[j].x);
+      WP->altitude  =  hgt2m(trklog->sh[j].height);
+      if (trklog->sh[j].speed >= 0)
+        WAYPT_SET(WP, speed, sp2mps(trklog->sh[j].speed));
+        else {                 /* bad speed < 0 - set to 0.0 */
+          WAYPT_UNSET(WP, speed);
+        }
+      track_add_wpt(TL, WP);
+    }
+  }
+}
+
+/**************************************************************************/
+
+static int find_wpt(struct wprdata* wprdata, const Waypoint* WP)
+{
+  struct wpt pattern;
+
+  str2lab(pattern.name, WP->shortname, WPT_NAME_LEN, nullptr, 0);
+  pattern.pt.x = deg2pt(WP->longitude);
+  pattern.pt.y = deg2pt(-WP->latitude);
+
+  struct wpt* wpt = wprdata->wpt;
+  for (int i = 0; i<MAXWPT; i++) {
+    int wpt_idx = wprdata->wpthdr.idx[i];
+    if (wpt_idx == WPT_IDX_NONE ||
+        wprdata->wpthdr.used[wpt_idx] == WPT_UNUSED) {
+      continue;
+    }
+    if (strncmp(wpt[wpt_idx].name, pattern.name, WPT_NAME_LEN) == 0 &&
+        wpt[wpt_idx].pt.x == pattern.pt.x &&
+        wpt[wpt_idx].pt.y == pattern.pt.y) {
+      return i;
+    }
+  }
+
+  return -1;
+}
+
+static int add_wpt(struct wprdata* wprdata, const Waypoint* WP,int isroute)
+{
+  struct wpt* wpt;
+  int i;
+
+  struct wpthdr* wpthdr = &(wprdata->wpthdr);
+
+  int hdr_idx = find_wpt(wprdata, WP);
+  if (hdr_idx >= 0) {
+    /* duplicate waypoint */
+    if (isroute) {
+      wpt = &(wprdata->wpt[wpthdr->idx[hdr_idx]]);
+      wpt->usecount ++;
+    }
+    return hdr_idx;
+  }
+
+  for (i=0; i<MAXWPT && wpthdr->idx[i] != WPT_IDX_NONE; i++) { }
+  hdr_idx = i;
+  for (i=0; i<MAXWPT && wpthdr->used[i] != WPT_UNUSED; i++) { }
+  int wpt_idx = i;
+  if (wpthdr->num >= MAXWPT || hdr_idx >= MAXWPT || wpt_idx >= MAXWPT) {
+    fatal(MYNAME ": Can't store more than %u waypoints\n", MAXWPT);
+  }
+
+  wpt = &(wprdata->wpt[wpt_idx]);
+  str2lab(wpt->name, WP->shortname, WPT_NAME_LEN, "W%05d", wpt_idx);
+  str2lab(wpt->comment, WP->description, WPT_COMMENT_LEN, nullptr, 0);
+  wpt->pt.x = deg2pt(WP->longitude);
+  wpt->pt.y = deg2pt(-WP->latitude);
+  wpt->usecount = isroute ? 1 : 0;
+  wpt->checked  = isroute ? 0 : 1;
+  wpt->reserved = 0;
+  pack_time(WP->GetCreationTime().toTime_t(), &(wpt->date), &(wpt->time));
+
+  wpthdr->idx[hdr_idx] = wpt_idx;
+  wpthdr->used[wpt_idx] = WPT_USED;
+  wpthdr->num++;
+  wpthdr->next++;
+  if (wpthdr->next >= MAXWPT) {        /* overrun */
+    wpthdr->next = 0;
+  }
+
+  return hdr_idx;
+}
+
+static void wpr_waypoint(const Waypoint* WP)
+{
+  add_wpt(&WPR, WP, 0);
+}
+
+static void wpr_route_hdr(const route_head* RT)
+{
+  int i;
+
+  struct rtehdr* rtehdr = &(WPR.rtehdr);
+  for (i=0; i<MAXRTE && rtehdr->idx[i] != RTE_IDX_NONE; i++) { }
+  int hdr_idx = i;
+  for (i=0; i<MAXRTE && rtehdr->used[i] != RTE_UNUSED; i++) { }
+  int rte_idx = i;
+  if (rtehdr->num >= MAXRTE || hdr_idx >= MAXRTE || rte_idx >= MAXRTE) {
+    fatal(MYNAME ": Can't store more than %u routes", MAXRTE);
+  }
+
+  struct rte* rte = &(WPR.rte[rte_idx]);
+  str2lab(rte->name, RT->rte_name, RTE_NAME_LEN, "R%03d", rte_idx);
+  str2lab(rte->comment, RT->rte_desc, RTE_COMMENT_LEN, nullptr, 0);
+  pack_time(time(nullptr), &(rte->date), &(rte->time));
+
+  rtehdr->idx[hdr_idx] = rte_idx;
+  rtehdr->used[rte_idx] = RTE_USED;
+  rtehdr->num++;
+  rtehdr->next++;
+  if (rtehdr->next >= MAXRTE) {        /* overrun */
+    rtehdr->next = 0;
+  }
+
+  /* if you want the new route to be active, uncomment the next line */
+  /* rtehdr->rteno = rte_idx; */
+}
+
+static void wpr_route_wpt(const Waypoint* WP)
+{
+  struct rte* rte = &(WPR.rte[WPR.rtehdr.num -1]);
+  if (rte->wptnum >= MAXWPTINRTE) {
+    fatal(MYNAME ": Can't store more than %u waypoints per route", MAXWPTINRTE);
+  }
+
+  int wpt_idx = add_wpt(&WPR, WP, 1);
+
+  rte->wptidx[rte->wptnum] = wpt_idx;
+  rte->wptnum ++;
+}
+
+static void wpr_route_trl(const route_head*)
+{
+  /* should we do some final sanity checks? */
+}
+
+static void wpr_write()
+{
+  int i;
+
+  WPR.wpthdr.id = WPT_HDR_ID;
+  WPR.wpthdr.num = WPR.wpthdr.next = 0;
+  for (i=0; i<MAXWPT; i++) {
+    WPR.wpthdr.idx[i]  = WPT_IDX_NONE;
+    WPR.wpthdr.used[i] = WPT_UNUSED;
+  }
+  memset(WPR.wpt, 0, MAXWPT * sizeof(struct wpt));
+  WPR.rtehdr.id = RTE_HDR_ID;
+  WPR.rtehdr.num = WPR.rtehdr.next = 0;
+  for (i=0; i<MAXRTE; i++) {
+    WPR.rtehdr.idx[i] = RTE_IDX_NONE;
+    WPR.rtehdr.used[i] = RTE_UNUSED;
+  }
+  WPR.rtehdr.rteno = RTE_RTENO_NONE;
+  memset(WPR.rte, 0, MAXRTE * sizeof(struct rte));
+
+  waypt_disp_all(wpr_waypoint);
+  route_disp_all(wpr_route_hdr, wpr_route_trl, wpr_route_wpt);
+
+  wpr_swap(&WPR);
+  if (gbfwrite(&WPR, sizeof(struct wprdata), 1, fout) != 1) {
+    fatal(MYNAME ": Write error on %s\n", fout->name);
+  }
+}
+
+/**************************************************************************/
+
+static void trl_track_hdr(const route_head* TL)
+{
+  int idx;
+
+  struct trkhdr* trkhdr = TRL.loghdr.trkhdr;
+
+  for (idx=0; idx< MAXTRK && trkhdr[idx].occupied != TRK_UNUSED; idx++) {}
+  if (idx >= MAXTRK) {
+    fatal(MYNAME ": Can't store more than %u tracklogs", MAXTRK);
+  }
+
+  if (!TL->rte_name.isEmpty()) {
+    strncpy(trkhdr[idx].name, CSTRc(TL->rte_name), TRK_NAME_LEN - 1);
+  }
+  if (*(trkhdr[idx].name) == '\0') {
+    sprintf(trkhdr[idx].name, "T%03d", idx);
+  }
+  trkhdr[idx].name[TRK_NAME_LEN-1] = '\0';
+
+  if (!TL->rte_desc.isEmpty()) {
+    strncpy(trkhdr[idx].comment, CSTRc(TL->rte_desc), TRK_COMMENT_LEN - 1);
+    int l = strlen(CSTRc(TL->rte_desc));
+    if (l < TRK_COMMENT_LEN-1) {
+      memset(trkhdr[idx].comment + l, ' ', TRK_COMMENT_LEN - 1 - l);
+    }
+  }
+  trkhdr[idx].comment[TRK_COMMENT_LEN-1] = '\0';
+
+  trkhdr[idx].occupied = TRK_USED;
+  trkhdr[idx].totalpt = 0;
+  trkhdr[idx].next = 0;
+
+  TRL.loghdr.num = idx;
+}
+
+static void trl_track_wpt(const Waypoint* WP)
+{
+  int trk_idx = TRL.loghdr.num;
+
+  struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[trk_idx]);
+  if (trkhdr->totalpt >= MAXPTINTRK) {
+    fatal(MYNAME ": Can't store more than %u points per track", MAXPTINTRK);
+  }
+  int log_idx = trkhdr->next;
+
+  struct trklog* trklog = &(TRL.trklog[trk_idx]);
+  trklog->pt[log_idx].x = deg2pt(WP->longitude);
+  trklog->pt[log_idx].y = deg2pt(-WP->latitude);
+  if WAYPT_HAS(WP, speed) {
+    trklog->sh[log_idx].speed =  mps2sp(WP->speed);
+  }
+  if (WP->altitude != unknown_alt) {
+    trklog->sh[log_idx].height = m2hgt(WP->altitude);
+  }
+
+  trkhdr->totalpt ++;
+  trkhdr->next = trkhdr->totalpt;
+}
+
+static void trl_track_tlr(const route_head*)
+{
+  int trk_idx = TRL.loghdr.num;
+  struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[trk_idx]);
+
+  if (trkhdr->totalpt == 0) {
+    trkhdr->occupied = TRK_UNUSED;
+  }
+
+  TRL.loghdr.num = -1;
+}
+
+static void trl_write()
+{
+  int i;
+
+  TRL.loghdr.id = TRL_HDR_ID;
+  TRL.loghdr.num = TRL.loghdr.next = -1;
+  TRL.loghdr.date = TRL.loghdr.time = 0;
+  for (i=0; i<MAXTRK; i++) {
+    struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[i]);
+    trkhdr->totalpt = 0;
+    trkhdr->next = 0;
+    memset(trkhdr->name, 0, TRK_NAME_LEN);
+    memset(trkhdr->comment, ' ', TRK_COMMENT_LEN);
+    trkhdr->comment[TRK_COMMENT_LEN-1] = '\0';
+    trkhdr->occupied = TRK_UNUSED;
+    trkhdr->show = TRK_HIDE;
+    trkhdr->fill = TRK_FILL;
+  }
+  memset(TRL.trklog, 0xff, sizeof(struct trklog) * MAXTRK);
+
+  track_disp_all(trl_track_hdr, trl_track_tlr, trl_track_wpt);
+
+  trl_swap(&TRL);
+
+  size_t fill = 0x10000 - 2 * sizeof(struct trklog);
+  void* buf = xmalloc(fill);
+  if (buf == nullptr) {
+    fatal(MYNAME ": Not enough memory\n");
+  }
+  memset(buf, 0xff, fill);
+
+  for (i=0; i<MAXTRK; i+=2) {
+    if (gbfwrite(&(TRL.trklog[i]), sizeof(struct trklog), 2, fout) != 2 ||
+        gbfwrite(buf, fill, 1, fout) != 1) {
+      fatal(MYNAME ": Write error on %s\n", fout->name);
+    }
+  }
+  xfree(buf);
+
+  fill = 0x1000 - sizeof(struct loghdr);
+  buf = xmalloc(fill);
+  if (buf == nullptr) {
+    fatal(MYNAME ": Not enough memory\n");
+  }
+  memset(buf, 0xff, fill);
+
+  if (gbfwrite(&(TRL.loghdr), sizeof(struct loghdr), 1, fout) != 1 ||
+      gbfwrite(buf, fill, 1, fout) != 1) {
+    fatal(MYNAME ": Write error on %s\n", fout->name);
+  }
+  xfree(buf);
+}
+
+/**************************************************************************/
+
+static void alan_rd_init(const QString& fname)
+{
+  fin = gbfopen(fname, "rb", MYNAME);
+}
+
+static void alan_rd_deinit()
+{
+  gbfclose(fin);
+  fin = nullptr;
+}
+
+
+static void alan_wr_init(const QString& fname)
+{
+  fout = gbfopen(fname, "wb", MYNAME);
+}
+
+static void alan_wr_deinit()
+{
+  gbfclose(fout);
+  fout = nullptr;
+}
+
+/**************************************************************************/
+
+ff_vecs_t alanwpr_vecs = {
+  ff_type_file,
+  {
+    (ff_cap)(ff_cap_read | ff_cap_write)       /* waypoints */,
+    ff_cap_none                /* tracks */,
+    (ff_cap)(ff_cap_read | ff_cap_write)       /* routes */
+  },
+  alan_rd_init,
+  alan_wr_init,
+  alan_rd_deinit,
+  alan_wr_deinit,
+  wpr_read,
+  wpr_write,
+  nullptr,
+  &wpr_args,
+  CET_CHARSET_ASCII, 0, /* ascii is the expected character set */
+  /* not fixed, can be changed through command line parameter */
+  NULL_POS_OPS,
+  nullptr
+};
+
+ff_vecs_t alantrl_vecs = {
+  ff_type_file,
+  {
+    ff_cap_none                /* waypoints */,
+    (ff_cap)(ff_cap_read | ff_cap_write)       /* tracks */,
+    ff_cap_none                /* routes */
+  },
+  alan_rd_init,
+  alan_wr_init,
+  alan_rd_deinit,
+  alan_wr_deinit,
+  trl_read,
+  trl_write,
+  nullptr,
+  &trl_args,
+  CET_CHARSET_ASCII, 0, /* ascii is the expected character set */
+  /* not fixed, can be changed through command line parameter */
+  NULL_POS_OPS,
+  nullptr
+};
diff --git a/deprecated/an1.cc b/deprecated/an1.cc
new file mode 100644 (file)
index 0000000..b773f0f
--- /dev/null
@@ -0,0 +1,1152 @@
+/*
+    Read DeLorme drawing files (.an1)
+
+    Copyright (C) 2005-2014 Ron Parker and Robert Lipe.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+ */
+
+#include <cstdio>               // for sprintf, SEEK_CUR
+#include <cstdint>              // for int32_t
+#include <cstdlib>              // for atoi, atof
+#include <cstring>              // for strlen, strchr, memcpy, strstr
+
+#include <QtCore/QString>       // for QString
+#include <QtCore/QVector>       // for QVector
+
+#include "defs.h"
+#include "formspec.h"           // for FsChainAdd, FsChainFind, FormatSpecificData, kFsAn1L, kFsAn1V, kFsAn1W
+#include "gbfile.h"             // for gbfgetint32, gbfputint32, gbfputint16, gbfgetint16, gbfile, gbfputs, gbfgetc, gbfputc, gbfclose, gbfopen_le, gbfgetdbl, gbfputdbl, gbfread, gbfseek
+#include "src/core/datetime.h"  // for DateTime
+
+
+#define MYNAME "an1"
+
+static gbfile* infile;
+static gbfile* outfile;
+
+static char* output_type = nullptr;
+static char* road_changes = nullptr;
+static char* nogc = nullptr;
+static char* nourl = nullptr;
+static char* opt_symbol = nullptr;
+static char* opt_color = nullptr;
+static char* opt_zoom  = nullptr;
+static char* opt_wpt_type = nullptr;
+static char* opt_radius = nullptr;
+
+static short output_type_num = 0;
+static short opt_zoom_num = 0;
+static long opt_color_num = 0;
+static short wpt_type_num = 0;
+static short last_read_type = 0;
+static double radius = 0.0;
+
+static long serial=10000;
+static long rtserial=1;
+
+struct roadchange {
+  long type;
+  char* name;
+};
+
+static roadchange* roadchanges = nullptr;
+
+static
+QVector<arglist_t> an1_args = {
+  {
+    "type", &output_type, "Type of .an1 file",
+    "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+  {
+    "road", &road_changes, "Road type changes",
+    "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+  {
+    "nogc", &nogc, "Do not add geocache data to description",
+    nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+  },
+  {
+    "nourl", &nourl, "Do not add URLs to description",
+    nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+  },
+  {
+    "deficon", &opt_symbol, "Symbol to use for point data",
+    "Red Flag", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+  {
+    "color", &opt_color, "Color for lines or mapnotes",
+    "red", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+  {
+    "zoom", &opt_zoom, "Zoom level to reduce points",
+    nullptr, ARGTYPE_INT, ARG_NOMINMAX, nullptr
+  },
+  {
+    "wpt_type", &opt_wpt_type,
+    "Waypoint type",
+    "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+  {
+    "radius", &opt_radius, "Radius for circles",
+    nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+};
+
+struct guid_t {
+  unsigned long l;
+  unsigned short s[3];
+  unsigned char c[6];
+};
+
+#include "an1sym.h"
+
+#define ReadShort(f) gbfgetint16(f)
+#define WriteShort(f,s) gbfputint16((s),f)
+#define ReadLong(f) gbfgetint32(f)
+#define WriteLong(f,l) gbfputint32((l),f)
+#define ReadDouble(f) gbfgetdbl(f)
+#define WriteDouble(f,d) gbfputdbl((d),f)
+
+static char*
+ReadString(gbfile* f, short len)
+{
+  auto* result = (char*)xcalloc(1, len + 1);
+  if (len) {
+    gbfread(result, 1, len, f);
+  }
+  return result;
+}
+
+#define ReadChar(f) (unsigned char) gbfgetc(f)
+#define WriteChar(f,c) gbfputc((unsigned char)(c),f)
+#define WriteString(f,s) gbfputs((s),f)
+
+static void
+ReadGuid(gbfile* f, guid_t* guid)
+{
+  guid->l = ReadLong(f);
+  for (unsigned short& i : guid->s) {
+    i = ReadShort(f);
+  }
+  for (unsigned char& i : guid->c) {
+    i = ReadChar(f);
+  }
+}
+
+static void
+WriteGuid(gbfile* f, guid_t* guid)
+{
+  WriteLong(f, guid->l);
+  for (int i = 0; i < 3; i++) {
+    WriteShort(f, guid->s[i]);
+  }
+  for (int i = 0; i < 6; i++) {
+    WriteChar(f, guid->c[i]);
+  }
+}
+
+static void
+Skip(gbfile* f,
+     unsigned long distance)
+{
+  gbfseek(f, distance, SEEK_CUR);
+}
+
+static double
+DecodeOrd(long ord)
+{
+  return (double)((int32_t)(0x80000000 - ord)) / 0x800000;
+}
+
+static long
+EncodeOrd(double ord)
+{
+  return (int32_t)(0x80000000 - (int32_t)(ord * 0x800000));
+}
+
+struct an1_symbol_record {
+  short hotspotxhi{0};
+  long hotspoty{0};
+  long unk1{0};
+  guid_t guid{};
+  char* name{nullptr};
+};
+
+struct an1_waypoint_record : FormatSpecificData {
+  an1_waypoint_record() : FormatSpecificData(kFsAn1W) {}
+private:
+  an1_waypoint_record(const an1_waypoint_record&) = default;
+public:
+  an1_waypoint_record& operator=(const an1_waypoint_record&) = delete;
+  an1_waypoint_record(an1_waypoint_record&&) = delete;
+  an1_waypoint_record& operator=(an1_waypoint_record&&) = delete;
+  ~an1_waypoint_record() override
+  {
+    xfree(name);
+    xfree(fontname);
+    xfree(url);
+    xfree(comment);
+    xfree(image_name);
+  }
+
+  an1_waypoint_record* clone() const override
+  {
+    auto* copy = new an1_waypoint_record(*this);
+    copy->name = xstrdup(name);
+    copy->fontname = xstrdup(fontname);
+    copy->url = xstrdup(url);
+    copy->comment = xstrdup(comment);
+    copy->image_name = xstrdup(image_name);
+    return copy;
+  }
+
+  short magic{0};
+  long unk1{0};
+  long lon{0};
+  long lat{0};
+  short type{0};
+  long height{0};
+  long width{0};
+  short unk2{0};
+  short unk3{0};
+  short serial{0};
+  short unk4{0};
+  unsigned char create_zoom{0};
+  unsigned char visible_zoom{0};
+  short unk5{0};
+  double radius{0.0}; /* in km */
+  char* name{nullptr};
+  char* fontname{nullptr};
+  guid_t guid{};
+  long fontcolor{0};
+  long fontstyle{0};
+  long fontsize{0};
+  long outlineweight{0};
+  long outlinecolor{0};
+  long outlineflags{0};
+  long fillcolor{0};
+  long unk6{0};
+  long fillflags{0};
+
+  /* Added in SA2006/Topo 6.0 */
+  short unk6_1{0};
+  char* url{nullptr};
+  char* comment{nullptr};
+  long creation_time{0};
+  long modification_time{0};
+  char* image_name{nullptr};
+};
+
+struct an1_vertex_record : FormatSpecificData {
+  an1_vertex_record() : FormatSpecificData(kFsAn1V) {}
+  an1_vertex_record* clone() const override
+  {
+    return new an1_vertex_record(*this);
+  }
+
+  short magic{0};
+  long unk0{0};
+  long lon{0};
+  long lat{0};
+  short unk1{0};
+};
+
+struct an1_line_record : FormatSpecificData {
+  an1_line_record() : FormatSpecificData(kFsAn1L) {}
+private:
+  an1_line_record(const an1_line_record&) = default;
+public:
+  an1_line_record& operator=(const an1_line_record&) = delete;
+  an1_line_record(an1_line_record&&) = delete;
+  an1_line_record& operator=(an1_line_record&&) = delete;
+  ~an1_line_record() override
+  {
+    xfree(name);
+  }
+
+  an1_line_record* clone() const override
+  {
+    auto* copy = new an1_line_record(*this);
+    copy->name = xstrdup(name);
+    return copy;
+  }
+
+  long roadtype{0};
+  short serial{0};
+  long unk2{0};
+  short unk3{0};
+  short type{0};
+  long unk4{0};
+  char* name{nullptr};
+  long lineweight{0};
+  long linestyle{0};
+  long linecolor{0};
+  long opacity{0};
+  long polyfillcolor{0};
+  long unk6{0};
+  long unk7{0};
+  short unk8{0};
+  long pointcount{0};
+};
+
+static void Destroy_AN1_Symbol(an1_symbol_record* symbol)
+{
+  xfree(symbol->name);
+}
+
+static void Read_AN1_Waypoint(gbfile* f, an1_waypoint_record* wpt)
+{
+  wpt->magic = ReadShort(f);
+  wpt->unk1 = ReadLong(f);
+  wpt->lon = ReadLong(f);
+  wpt->lat = ReadLong(f);
+  wpt->type = ReadShort(f);
+  wpt->height = ReadLong(f);
+  wpt->width = ReadLong(f);
+  wpt->unk2 = ReadShort(f);
+  wpt->unk3 = ReadShort(f);
+  wpt->serial = ReadShort(f);
+  wpt->unk4 = ReadShort(f);
+  wpt->create_zoom = ReadChar(f);
+  wpt->visible_zoom = ReadChar(f);
+  wpt->unk5 = ReadShort(f);
+  wpt->radius = ReadDouble(f);
+  unsigned short len = ReadShort(f);
+  wpt->name = ReadString(f, len);
+
+  if (len != strlen(wpt->name)) {
+    /* This happens in 06/6.0 files that put extra data in the
+     * name record for backward compatibility's sake */
+    char* ofs = wpt->name + strlen(wpt->name) + 1;
+    wpt->unk6_1 = le_read16(ofs);
+    ofs += 2;
+
+    len = le_read16(ofs);
+    ofs += 2;
+
+    if (len) {
+      /*
+       * Trust URL encoded in new format over one in
+       * old format if both are present.  Whack the
+       * name starting at '{URL='.
+       */
+      char* oldurlstr = strstr(wpt->name, "{URL=");
+      if (oldurlstr) {
+        *oldurlstr = 0;
+      }
+      wpt->url = (char*) xcalloc(len+1, 1);
+      memcpy(wpt->url, ofs, len);
+      ofs += len;
+    }
+
+    len = le_read16(ofs);
+    ofs += 2;
+
+    if (len) {
+      wpt->comment = (char*) xcalloc(len+1, 1);
+      memcpy(wpt->comment, ofs, len);
+      ofs += len;
+    }
+
+    /* these are quadwords, presumably for year-2038 compat. */
+    wpt->creation_time = le_read32(ofs);
+    ofs += 8;
+
+    wpt->modification_time = le_read32(ofs);
+    ofs += 8;
+  }
+
+  if (wpt->type == 0x12) {
+    /* 'image' type */
+    ReadShort(f);    /* length of font + filename */
+    len = ReadShort(f);
+    wpt->fontname = ReadString(f, len);
+    len = ReadShort(f);
+    wpt->image_name = ReadString(f, len);
+  } else {
+    len = ReadShort(f);
+    wpt->fontname = ReadString(f, len);
+    wpt->image_name = nullptr;
+  }
+  ReadGuid(f, &wpt->guid);
+  wpt->fontcolor = ReadLong(f);
+  wpt->fontstyle = ReadLong(f);
+  wpt->fontsize = ReadLong(f);
+  wpt->outlineweight = ReadLong(f);
+  wpt->outlinecolor = ReadLong(f);
+  wpt->outlineflags = ReadLong(f);
+  wpt->fillcolor = ReadLong(f);
+  wpt->unk6 = ReadLong(f);
+  wpt->fillflags = ReadLong(f);
+}
+
+static void Write_AN1_Waypoint(gbfile* f, an1_waypoint_record* wpt)
+{
+  WriteShort(f, wpt->magic);
+  WriteLong(f, wpt->unk1);
+  WriteLong(f, wpt->lon);
+  WriteLong(f, wpt->lat);
+  WriteShort(f, wpt->type);
+  WriteLong(f, wpt->height);
+  WriteLong(f, wpt->width);
+  WriteShort(f, wpt->unk2);
+  WriteShort(f, wpt->unk3);
+  WriteShort(f, wpt->serial);
+  WriteShort(f, wpt->unk4);
+  WriteChar(f, wpt->create_zoom);
+  WriteChar(f, wpt->visible_zoom);
+  WriteShort(f, wpt->unk5);
+  WriteDouble(f, wpt->radius);
+
+  short len = strlen(wpt->name) + 1 + 2 + 2 +
+              (wpt->url ? strlen(wpt->url) : 0) + 2 +
+              (wpt->comment ? strlen(wpt->comment) : 0) + 8 + 8;
+  WriteShort(f, len);
+  WriteString(f, wpt->name);
+  WriteChar(f, 0);    /* name string terminator */
+
+  WriteShort(f, wpt->unk6_1);
+
+  if (wpt->url) {
+    WriteShort(f, strlen(wpt->url));
+    WriteString(f, wpt->url);
+  } else {
+    WriteShort(f, 0);
+  }
+
+  if (wpt->comment) {
+    WriteShort(f, strlen(wpt->comment));
+    WriteString(f, wpt->comment);
+  } else {
+    WriteShort(f, 0);
+  }
+
+  WriteLong(f, wpt->creation_time);
+  WriteLong(f, 0);
+
+  WriteLong(f, wpt->modification_time);
+  WriteLong(f, 0);
+
+  if (wpt->type == 0x12) {   /* image */
+    len = 2 + (wpt->fontname ? strlen(wpt->fontname) : 0) +
+          2 + (wpt->image_name ? strlen(wpt->image_name) : 0);
+    WriteShort(f, len);
+    if (wpt->fontname) {
+      len = strlen(wpt->fontname);
+      WriteShort(f, len);
+      WriteString(f, wpt->fontname);
+    } else {
+      WriteShort(f, 0);
+    }
+    if (wpt->image_name) {
+      len = strlen(wpt->image_name);
+      WriteShort(f, len);
+      WriteString(f, wpt->image_name);
+    } else {
+      WriteShort(f, 0);
+    }
+  } else {
+    len = strlen(wpt->fontname);
+    WriteShort(f, len);
+    WriteString(f, wpt->fontname);
+  }
+  WriteGuid(f, &wpt->guid);
+  WriteLong(f, wpt->fontcolor);
+  WriteLong(f, wpt->fontstyle);
+  WriteLong(f, wpt->fontsize);
+  WriteLong(f, wpt->outlineweight);
+  WriteLong(f, wpt->outlinecolor);
+  WriteLong(f, wpt->outlineflags);
+  WriteLong(f, wpt->fillcolor);
+  WriteLong(f, wpt->unk6);
+  WriteLong(f, wpt->fillflags);
+}
+
+static void Read_AN1_Vertex(gbfile* f, an1_vertex_record* vertex)
+{
+
+  vertex->magic = ReadShort(f);
+  vertex->unk0 = ReadLong(f);
+  vertex->lon = ReadLong(f);
+  vertex->lat = ReadLong(f);
+  vertex->unk1 = ReadShort(f);
+}
+
+static void Write_AN1_Vertex(gbfile* f, an1_vertex_record* vertex)
+{
+  WriteShort(f, vertex->magic);
+  WriteLong(f, vertex->unk0);
+  WriteLong(f, vertex->lon);
+  WriteLong(f, vertex->lat);
+  WriteShort(f, vertex->unk1);
+}
+
+static void Read_AN1_Line(gbfile* f, an1_line_record* line)
+{
+  line->roadtype = ReadLong(f);
+  line->serial = ReadShort(f);
+  line->unk2 = ReadLong(f);
+  line->unk3 = ReadShort(f);
+  line->type = ReadShort(f);
+  line->unk4 = ReadLong(f);
+  short len = ReadShort(f);
+  line->name = ReadString(f, len);
+  line->lineweight = ReadShort(f);
+  line->linestyle = ReadLong(f);
+  line->linecolor = ReadLong(f);
+  line->opacity = ReadLong(f);
+  line->polyfillcolor = ReadLong(f);
+  line->unk6 = ReadLong(f);
+  line->unk7 = ReadLong(f);
+  line->unk8 = ReadShort(f);
+  line->pointcount = ReadLong(f);
+}
+
+static void Write_AN1_Line(gbfile* f, an1_line_record* line)
+{
+  WriteLong(f, line->roadtype);
+  WriteShort(f, line->serial);
+  WriteLong(f, line->unk2);
+  WriteShort(f, line->unk3);
+  WriteShort(f, line->type);
+  WriteLong(f, line->unk4);
+  short len = strlen(line->name);
+  WriteShort(f, len);
+  WriteString(f, line->name);
+  WriteShort(f, (short) line->lineweight);
+  WriteLong(f, line->linestyle);
+  WriteLong(f, line->linecolor);
+  WriteLong(f, line->opacity);
+  WriteLong(f, line->polyfillcolor);
+  WriteLong(f, line->unk6);
+  WriteLong(f, line->unk7);
+  WriteShort(f, line->unk8);
+  WriteLong(f, line->pointcount);
+}
+
+static void Skip_AN1_IL(gbfile* f)
+{
+  Skip(f, 26);
+}
+
+static void Skip_AN1_BM(gbfile* f)
+{
+  Skip(f, 8);    /* BITMAPFILEHEADER fields 1-3 */
+  unsigned long bitoffset = ReadLong(f);
+
+  unsigned long bmisize = ReadLong(f);
+  Skip(f, 16);    /* BITMAPINFOHEADER fields 2-6 */
+  unsigned long bmsize = ReadLong(f);
+  Skip(f, 16);    /* BITMAPINFOHEADER fields 8-11 */
+
+  unsigned long palettesize = bitoffset - bmisize - 14;
+  Skip(f, bmsize + palettesize);
+}
+
+static void Read_AN1_Symbol(gbfile* f, an1_symbol_record* symbol)
+{
+  /* This is just the high word of a long; we ate the low
+   * word in the caller.  Fortunately, we don't care. */
+  symbol->hotspotxhi = ReadShort(f);
+  symbol->hotspoty = ReadLong(f);
+  symbol->unk1 = ReadLong(f);
+  ReadGuid(f, &symbol->guid);
+  short len = ReadChar(f);
+  symbol->name = ReadString(f, len);
+}
+
+static void Read_AN1_Header(gbfile* f)
+{
+  unsigned short magic = ReadShort(f);
+  (void) magic; // hush warning.
+  unsigned short type = ReadShort(f);
+
+  last_read_type = type;
+}
+
+static void Write_AN1_Header(gbfile* f)
+{
+  WriteShort(f, 11557);
+  WriteShort(f, output_type_num);
+}
+
+static void Read_AN1_Bitmaps(gbfile* f)
+{
+  an1_symbol_record symbol;
+
+  long count = ReadLong(f);
+
+  while (count) {
+    unsigned short magic = ReadShort(f);
+    switch (magic) {
+    case 0x4d42:
+      Skip_AN1_BM(f);
+      break;
+    case 0x4c49:
+      Skip_AN1_IL(f);
+      break;
+    default:
+      Read_AN1_Symbol(f, &symbol);
+      Destroy_AN1_Symbol(&symbol);
+      count--;
+      break;
+    }
+  }
+
+  /* Read the symbol table */
+}
+
+static void Write_AN1_Bitmaps(gbfile* f)
+{
+  /* On write, we don't output any bitmaps, so writing them
+   * is just a matter of writing a count of zero */
+  WriteLong(f, 0);
+}
+
+static void Read_AN1_Waypoints(gbfile* f)
+{
+  const char* icon = nullptr;
+  ReadShort(f);
+  unsigned long count = ReadLong(f);
+  for (unsigned long i = 0; i < count; i++) {
+    auto* rec = new an1_waypoint_record;
+    Read_AN1_Waypoint(f, rec);
+    auto* wpt_tmp = new Waypoint;
+
+    if (rec->creation_time) {
+      wpt_tmp->SetCreationTime(rec->creation_time);
+    }
+    wpt_tmp->longitude = -DecodeOrd(rec->lon);
+    wpt_tmp->latitude = DecodeOrd(rec->lat);
+    wpt_tmp->notes = rec->comment;
+    wpt_tmp->description = rec->name;
+
+    if (rec->url) {
+      wpt_tmp->AddUrlLink(rec->url);
+    } else {
+      int u = wpt_tmp->description.indexOf("{URL=");
+      if (u != -1) {
+        QString us = wpt_tmp->description.mid(u);
+        us.remove(0,5); // throw away anything up to and including "{URL="
+        us.chop(1); // throw away final character, assumed to be "}"
+        if (!us.isEmpty()) {
+          wpt_tmp->AddUrlLink(us);
+        }
+      }
+    }
+
+    if (rec->image_name) {
+      wpt_tmp->icon_descr = rec->image_name;
+    } else if (FindIconByGuid(&rec->guid, &icon)) {
+      wpt_tmp->icon_descr = icon;
+    }
+
+    wpt_tmp->fs.FsChainAdd(rec);
+    rec = nullptr;
+    waypt_add(wpt_tmp);
+  }
+}
+
+static void
+Write_One_AN1_Waypoint(const Waypoint* wpt)
+{
+  an1_waypoint_record* rec;
+
+  const auto* source_rec = reinterpret_cast<an1_waypoint_record*>(wpt->fs.FsChainFind(kFsAn1W));
+
+  if (source_rec != nullptr) {
+    rec = source_rec->clone();
+    if (opt_zoom) {
+      rec->visible_zoom = opt_zoom_num;
+    }
+  } else {
+    rec = new an1_waypoint_record;
+    rec->magic = 1;
+    rec->type = wpt_type_num;
+    rec->unk2 = 3;
+    rec->unk3 = 18561;
+    rec->radius = radius;
+    rec->fillcolor = opt_color_num;
+    rec->fillflags = 3;
+    if (wpt_type_num == 5) {
+      rec->fillflags = 0x8200;
+    }
+    rec->height = -50;
+    rec->width = 20;
+    rec->fontname = xstrdup("Arial");
+    FindIconByName(opt_symbol, &rec->guid);
+    rec->fontsize = 10;
+    rec->visible_zoom = opt_zoom?opt_zoom_num:10;
+    rec->unk6_1 = 1;
+  }
+  xfree(rec->name);
+  rec->name = xstrdup(wpt->description);
+
+  if (!nogc && wpt->gc_data->id) {
+    // FIXME: this whole mess should be qstring concatenation
+    auto* extra = (char*) xmalloc(25 + wpt->gc_data->placer.length() + wpt->shortname.length());
+    sprintf(extra, "\r\nBy %s\r\n%s (%1.1f/%1.1f)",
+            CSTR(wpt->gc_data->placer),
+            CSTRc(wpt->shortname), wpt->gc_data->diff/10.0,
+            wpt->gc_data->terr/10.0);
+    rec->name = xstrappend(rec->name, extra);
+    xfree(extra);
+  }
+
+  if (!nourl && wpt->HasUrlLink()) {
+    UrlLink l = wpt->GetUrlLink();
+    int len = 7 + l.url_.length();
+    auto* extra = (char*)xmalloc(len);
+    sprintf(extra, "{URL=%s}", CSTR(l.url_));
+    rec->name = xstrappend(rec->name, extra);
+    xfree(extra);
+    if (rec->url) {
+      xfree(rec->url);
+    }
+    rec->url = xstrdup(l.url_);
+  }
+  if (!wpt->notes.isEmpty()) {
+    if (rec->comment) {
+      xfree(rec->comment);
+    }
+    rec->comment = xstrdup(wpt->notes);
+  }
+
+
+  rec->creation_time = rec->modification_time = wpt->GetCreationTime().toTime_t();
+  rec->lat = EncodeOrd(wpt->latitude);
+  rec->lon = EncodeOrd(-wpt->longitude);
+  rec->serial = serial++;
+
+  if (rec->type == 0x12) {    /* image */
+    if (wpt->icon_descr.contains(":\\")) {
+      rec->image_name = xstrdup(wpt->icon_descr);
+      rec->height = -244;
+      rec->width = -1;
+    }
+  }
+  if (!rec->image_name && !wpt->icon_descr.isNull()) {
+    FindIconByName(CSTR(wpt->icon_descr), &rec->guid);
+  }
+
+  Write_AN1_Waypoint(outfile, rec);
+  delete rec;
+}
+
+static void Write_AN1_Waypoints(gbfile* f)
+{
+  WriteShort(f, 2);
+  WriteLong(f, waypt_count());
+  waypt_disp_all(Write_One_AN1_Waypoint);
+}
+
+static void Read_AN1_Lines(gbfile* f)
+{
+  ReadShort(f);
+  unsigned long count = ReadLong(f);
+  for (unsigned long i = 0; i < count; i++) {
+    auto* rec = new an1_line_record;
+    Read_AN1_Line(f, rec);
+    /* create route rec */
+    auto* rte_head = new route_head;
+    rte_head->line_color.bbggrr = rec->linecolor;
+    if (rec->opacity == 0x8200) {
+      rte_head->line_color.opacity = 128;
+    }
+    // lineweight isn't set for dashed/dotted lines
+    // Since we don't have a way to represent this internally yet,
+    // use leave line_width at the default.
+    if (rec->lineweight) {
+      rte_head->line_width = rec->lineweight;
+    }
+    rte_head->rte_name = rec->name;
+    rte_head->fs.FsChainAdd(rec);
+    route_add_head(rte_head);
+    for (unsigned long j = 0; j < (unsigned) rec->pointcount; j++) {
+      auto* vert = new an1_vertex_record;
+      Read_AN1_Vertex(f, vert);
+
+      /* create route point */
+      auto* wpt_tmp = new Waypoint;
+      wpt_tmp->latitude = DecodeOrd(vert->lat);
+      wpt_tmp->longitude = -DecodeOrd(vert->lon);
+      wpt_tmp->shortname = QString::asprintf("\\%5.5lx", rtserial++);
+      wpt_tmp->fs.FsChainAdd(vert);
+      route_add_wpt(rte_head, wpt_tmp);
+    }
+  }
+}
+
+static void
+Make_Road_Changes(an1_line_record* rec)
+{
+  int i = 0;
+
+  if (!rec) {
+    return;
+  }
+
+  if (!roadchanges) {
+    return;
+  }
+
+  while (roadchanges[i].name) {
+    if (!case_ignore_strcmp(roadchanges[i].name, rec->name)) {
+      rec->roadtype = roadchanges[i].type;
+      break;
+    }
+    i++;
+  }
+}
+
+static void
+Write_One_AN1_Line(const route_head* rte)
+{
+  an1_line_record* rec;
+
+  const auto* source_rec = reinterpret_cast<an1_line_record*>(rte->fs.FsChainFind(kFsAn1L));
+
+  if (source_rec != nullptr) {
+    rec = source_rec->clone();
+    switch (output_type_num) {
+    case 1:
+      if (rec->type != 14) {
+        rec->roadtype = 0x11100541;
+        rec->unk2 = 655360;
+        rec->type = 14;
+        rec->unk8 = 2;
+      } // end if
+      Make_Road_Changes(rec);
+      break;
+    case 2:
+      if (rec->type != 15) {
+        rec->type = 15;
+      } // end if
+      break;
+    case 4:
+      if (rec->type != 16) {
+        rec->type = 16;
+      } // end if
+      break;
+    }
+  } else {
+    rec = new an1_line_record;
+    rec->name = nullptr;
+    switch (output_type_num) {
+    /*  drawing road trail waypoint track  */
+    case 1: /* road */
+      rec->roadtype = 0x11100541;
+      rec->unk2 = 655360;
+      rec->type = 14;
+      rec->unk8 = 2;
+      rec->name = xstrdup(rte->rte_name);
+      break;
+
+    case 2: /* trail */
+      rec->roadtype = 0x11071c50;
+      rec->unk2 = 917504;
+      rec->type = 15;
+      rec->unk8 = 2;
+      break;
+
+    case 4: /* track */
+      rec->roadtype = 0x48800015;
+      rec->unk2 = 917504;
+      rec->type = 16;
+      rec->unk4 = 2;
+      rec->unk8 = 2;
+      break;
+
+    case 0: /* drawing */
+    case 3: /* waypoint - shouldn't have lines */
+    default:
+      rec->roadtype = 0x48800015;
+      rec->unk2 = 1048576;
+      rec->type = 2;
+      rec->unk4 = 2;
+      rec->lineweight = 6;
+      rec->linecolor = opt_color_num; /* red */
+      rec->opacity = 3;
+      rec->unk8 = 2;
+      break;
+    }
+    if (!rec->name) {
+      rec->name = xstrdup("");
+    }
+
+  }
+  rec->serial = serial++;
+  rec->pointcount = rte->rte_waypt_ct;
+  Write_AN1_Line(outfile, rec);
+  delete rec;
+}
+
+static void
+Write_One_AN1_Vertex(const Waypoint* wpt)
+{
+  an1_vertex_record* rec;
+
+  const auto* source_rec = reinterpret_cast<an1_vertex_record*>(wpt->fs.FsChainFind(kFsAn1V));
+
+  if (source_rec != nullptr) {
+    rec = source_rec->clone();
+  } else {
+    rec = new an1_vertex_record;
+    rec->magic = 1;
+  }
+  rec->lat = EncodeOrd(wpt->latitude);
+  rec->lon = EncodeOrd(-wpt->longitude);
+
+  Write_AN1_Vertex(outfile, rec);
+  delete rec;
+}
+
+static void Write_AN1_Lines(gbfile* f)
+{
+  WriteShort(f, 2);
+  WriteLong(f, route_count()+track_count());
+
+  route_disp_all(Write_One_AN1_Line, nullptr, Write_One_AN1_Vertex);
+  track_disp_all(Write_One_AN1_Line, nullptr, Write_One_AN1_Vertex);
+}
+
+static void
+Init_Wpt_Type()
+{
+  if (!opt_wpt_type || !opt_wpt_type[0]) {
+    wpt_type_num = 1; /* marker */
+    return;
+  }
+  if ((opt_wpt_type[0] & 0xf0) == 0x30) {
+    wpt_type_num = atoi(opt_wpt_type);
+  } else {
+    wpt_type_num = 1; /* marker */
+    if (!case_ignore_strcmp(opt_wpt_type, "marker")) {
+      wpt_type_num = 1;
+    } else if (!case_ignore_strcmp(opt_wpt_type, "symbol")) {
+      wpt_type_num = 1; /* symbol and marker are synonyms */
+    } else if (!case_ignore_strcmp(opt_wpt_type, "text")) {
+      wpt_type_num = 4;
+    } else if (!case_ignore_strcmp(opt_wpt_type, "mapnote")) {
+      wpt_type_num = 6;
+    } else if (!case_ignore_strcmp(opt_wpt_type, "circle")) {
+      wpt_type_num = 5;
+    } else if (!case_ignore_strcmp(opt_wpt_type, "image")) {
+      wpt_type_num = 18;
+    } else {
+      fatal(MYNAME ": wpt_type must be "
+            "symbol, text, mapnote, circle, or image\n");
+    }
+  }
+}
+
+static void
+Init_Output_Type()
+{
+  if (!output_type || !output_type[0]) {
+    output_type_num = last_read_type;
+    return;
+  }
+  if ((output_type[0] & 0xf0) == 0x30) {
+    output_type_num = atoi(output_type);
+  } else {
+    output_type_num = 0;
+    if (!case_ignore_strcmp(output_type, "drawing")) {
+      output_type_num = 0;
+    } else if (!case_ignore_strcmp(output_type, "road")) {
+      output_type_num = 1;
+    } else if (!case_ignore_strcmp(output_type, "trail")) {
+      output_type_num = 2;
+    } else if (!case_ignore_strcmp(output_type, "waypoint")) {
+      output_type_num = 3;
+    } else if (!case_ignore_strcmp(output_type, "track")) {
+      output_type_num = 4;
+    } else {
+      fatal(MYNAME ": type must be "
+            "drawing, road, trail, waypoint, or track\n");
+    }
+  }
+  last_read_type = output_type_num;
+}
+
+static long
+Parse_Change_Type(char* type)
+{
+  long retval = 0x11100541;
+
+  if (!case_ignore_strcmp(type, "limited")) {
+    retval = 0x11070430;
+  } else if (!case_ignore_strcmp(type, "toll")) {
+    retval = 0x11070470;
+  } else if (!case_ignore_strcmp(type, "us")) {
+    retval = 0x11070870;
+  } else if (!case_ignore_strcmp(type, "state")) {
+    retval = 0x11070c10;
+  } else if (!case_ignore_strcmp(type, "primary")) {
+    /* primary state/provincial routes */
+    retval = 0x11070840;
+  } else if (!case_ignore_strcmp(type, "major")) {
+    retval = 0x11070c30;
+  } else if (!case_ignore_strcmp(type, "local")) {
+    retval = 0x11071010;
+  } else if (!case_ignore_strcmp(type, "ramp")) {
+    retval = 0x11070cb0;
+  } else if (!case_ignore_strcmp(type, "ferry")) {
+    retval = 0x11070ca0;
+  } else if (!case_ignore_strcmp(type, "editable")) {
+    retval = 0x11100541;
+  } else {
+    fatal(MYNAME ": unknown road type for road changes\n");
+  }
+  return retval;
+}
+
+static void
+Free_Road_Changes()
+{
+  int i = 0;
+  if (roadchanges) {
+    while (roadchanges[i].name) {
+      xfree(roadchanges[i].name);
+      i++;
+    }
+    xfree(roadchanges);
+  }
+  roadchanges = nullptr;
+}
+
+static void
+Init_Road_Changes()
+{
+  int count = 0;
+  Free_Road_Changes();
+
+  if (!road_changes || !road_changes[0]) {
+    return;
+  }
+  char* bar = strchr(road_changes, '!');
+  while (bar) {
+    count++;
+    bar = strchr(bar+1, '!');
+  }
+  if (!(count&1)) {
+    fatal(MYNAME ": invalid format for road changes\n");
+  }
+  count = 1 + count / 2;
+  roadchanges = (roadchange*)xmalloc((count+1) * sizeof(roadchange));
+
+  roadchanges[count].type = 0;
+  roadchanges[count].name = nullptr;
+
+  char* copy = xstrdup(road_changes);
+  bar = copy;
+
+  while (count) {
+    count--;
+    char* name = bar;
+    bar = strchr(name, '!');
+    *bar = '\0';
+    bar++;
+    char* strType = bar;
+    bar = strchr(strType, '!');
+    if (bar) {
+      *bar = '\0';
+      bar++;
+    }
+    roadchanges[count].name = xstrdup(name);
+    roadchanges[count].type = Parse_Change_Type(strType);
+  }
+
+  xfree(copy);
+}
+
+static void
+rd_init(const QString& fname)
+{
+  infile = gbfopen_le(fname, "rb", MYNAME);
+}
+
+static void
+rd_deinit()
+{
+  gbfclose(infile);
+}
+
+static void
+my_read()
+{
+  Read_AN1_Header(infile);
+  Read_AN1_Bitmaps(infile);
+  Read_AN1_Waypoints(infile);
+  Read_AN1_Lines(infile);
+}
+
+static void
+wr_init(const QString& fname)
+{
+  outfile = gbfopen_le(fname, "wb", MYNAME);
+  Init_Output_Type();
+  Init_Road_Changes();
+  opt_color_num = color_to_bbggrr(opt_color);
+  Init_Wpt_Type();
+  if (opt_zoom) {
+    opt_zoom_num = atoi(opt_zoom);
+  }
+  radius = .1609344; /* 1/10 mi in kilometers */
+  if (opt_radius) {
+    radius = atof(opt_radius);
+    if (!strchr(opt_radius,'k') && !strchr(opt_radius,'K')) {
+      radius *= kKilometersPerMile;
+    }
+  }
+}
+
+static void
+wr_deinit()
+{
+  Free_Road_Changes();
+  gbfclose(outfile);
+}
+
+static void
+my_write()
+{
+  Write_AN1_Header(outfile);
+  Write_AN1_Bitmaps(outfile);
+  Write_AN1_Waypoints(outfile);
+  Write_AN1_Lines(outfile);
+}
+
+ff_vecs_t an1_vecs = {
+  ff_type_file,
+  {
+    (ff_cap)(ff_cap_read | ff_cap_write)       /* waypoints */,
+    ff_cap_write                       /* tracks */,
+    (ff_cap)(ff_cap_read | ff_cap_write)       /* routes */,
+  },
+  rd_init,
+  wr_init,
+  rd_deinit,
+  wr_deinit,
+  my_read,
+  my_write,
+  nullptr,
+  &an1_args,
+  CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+  , NULL_POS_OPS,
+  nullptr
+};
diff --git a/deprecated/an1sym.h b/deprecated/an1sym.h
new file mode 100644 (file)
index 0000000..df9bca6
--- /dev/null
@@ -0,0 +1,734 @@
+/*
+
+
+
+
+
+
+
+
+
+                       THIS FILE IS AUTOMATICALLY GENERATED
+
+
+                       Please change make-an1sym.pl and
+                       regenerate it rather than changing
+                       this file directly.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+*/
+
+/*
+    Read DeLorme drawing files (.an1) - supplemental (included by an1.c)
+
+    Copyright (C) 2005 Ron Parker and Robert Lipe.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+ */
+
+static struct defguid {
+  guid_t guid;
+  const char* name;
+} default_guids[] = {
+  { {0xb610bc70,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Hiker"
+  },
+  { {0xb610bc71,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Canoe"
+  },
+  { {0xb610bc72,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Kayak"
+  },
+  { {0xb610bc73,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Bike"
+  },
+  { {0xb610bc74,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Four wheeler"
+  },
+  { {0xb610bc75,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Jeep"
+  },
+  { {0xb610bc76,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Snowmobile"
+  },
+  { {0xb610bc78,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Rec Vehicle"
+  },
+  { {0xb610bc79,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Fire"
+  },
+  { {0xb610bc7a,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Fishing"
+  },
+  { {0xb610bc7b,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Tree"
+  },
+  { {0xb610bc7c,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Pine Tree"
+  },
+  { {0xb610bc7d,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Birch"
+  },
+  { {0xb610bc7e,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Deer"
+  },
+  { {0xb610bc7f,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Moose"
+  },
+  { {0x99d8c163,{0x7622, 0x11d5, 0xe8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Mud"
+  },
+  { {0x012dfac2,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Tractor"
+  },
+  { {0x012dfac3,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Combine Harvester"
+  },
+  { {0x012dfac7,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Front-End Loader"
+  },
+  { {0xfd163780,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Power Shovel"
+  },
+  { {0xfd163781,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Road Grader"
+  },
+  { {0xfd163784,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Road Roller"
+  },
+  { {0xfd163787,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dump Truck"
+  },
+  { {0x5673d712,{0xb28d, 0x11d5, 0x13b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Skid-Steer Loader"
+  },
+  { {0xb86045ac,{0x390f, 0x420f, 0x91a7}, {0x76, 0x2f, 0x48, 0xea, 0xe2, 0xd7}},
+    "Highway Sign"
+  },
+  { {0x1e129e95,{0x13b6, 0x48d8, 0x3fa3}, {0x9c, 0xc8, 0x20, 0x8e, 0x1d, 0x9d}},
+    "Orange Cone"
+  },
+  { {0xadee7d54,{0xf7c9, 0x4ab6, 0xfb93}, {0x99, 0xc3, 0xbc, 0x9d, 0x15, 0x47}},
+    "Barricade"
+  },
+  { {0xa170000f,{0x8bd8, 0x4574, 0x58ac}, {0x55, 0x41, 0x67, 0xef, 0x64, 0x62}},
+    "Flagger"
+  },
+  { {0xa425f90e,{0x6ab6, 0x4ca9, 0x8997}, {0xbf, 0xca, 0xe0, 0xc2, 0x2b, 0x53}},
+    "Construction Sign"
+  },
+  { {0x0805b240,{0x6b26, 0x4300, 0xebb1}, {0xea, 0x9b, 0xcf, 0x68, 0xc6, 0x18}},
+    "Construction Flasher"
+  },
+  { {0x56721a6c,{0x8e77, 0x4b62, 0x09aa}, {0xce, 0xdc, 0x69, 0x4a, 0x16, 0x05}},
+    "Transit"
+  },
+  { {0x623e1ee9,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Arrow Left"
+  },
+  { {0x623e1eea,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Arrow Right"
+  },
+  { {0x623e1eeb,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Arrow Up"
+  },
+  { {0x623e1eec,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Arrow Down"
+  },
+  { {0x623e1eed,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Arrow Up Left"
+  },
+  { {0x623e1eee,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Arrow Up Right"
+  },
+  { {0x623e1eef,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Arrow Down Left"
+  },
+  { {0x623e1ef0,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Arrow Down Right"
+  },
+  { {0x83f91421,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Arrow Left"
+  },
+  { {0x83f91422,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Arrow Right"
+  },
+  { {0x83f91423,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Arrow Up"
+  },
+  { {0x83f91424,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Arrow Down"
+  },
+  { {0x83f91425,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Arrow Up Left"
+  },
+  { {0x83f91426,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Arrow Up Right"
+  },
+  { {0x83f91427,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Arrow Down Left"
+  },
+  { {0x83f91428,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Arrow Down Right"
+  },
+  { {0x83f91429,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Large Arrow Left"
+  },
+  { {0x83f9142a,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Large Arrow Right"
+  },
+  { {0x83f9142b,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Large Arrow Up"
+  },
+  { {0x83f9142c,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Large Arrow Down"
+  },
+  { {0x83f9142d,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Large Arrow Down Right"
+  },
+  { {0x83f9142e,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Large Arrow Down Left"
+  },
+  { {0x83f9142f,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Large Arrow Up Left"
+  },
+  { {0x83f91430,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Large Arrow Up Right"
+  },
+  { {0x8ff0aad1,{0xc53d, 0x4998, 0x7ebd}, {0x06, 0x60, 0x25, 0x6c, 0x4f, 0x6d}},
+    "Accommodation"
+  },
+  { {0xaf7bf199,{0x6a8b, 0x49fe, 0xae92}, {0xa3, 0x09, 0x7b, 0xb8, 0x81, 0x6a}},
+    "Australia"
+  },
+  { {0x6bbcc9d1,{0x6a19, 0x4c7b, 0xc6a2}, {0x3e, 0x17, 0x02, 0xd6, 0xee, 0x3a}},
+    "Blue Dome Cross"
+  },
+  { {0xfff920fe,{0xd780, 0x49d4, 0x1bad}, {0x55, 0x2e, 0xc7, 0xdf, 0xa2, 0xaa}},
+    "Green Dome Cross"
+  },
+  { {0x57e75924,{0xd6fa, 0x4666, 0x84bf}, {0x5b, 0x76, 0xa1, 0xd0, 0x14, 0x5f}},
+    "Business"
+  },
+  { {0xb09ef4a7,{0x95e4, 0x4e5e, 0x5e84}, {0xbe, 0x2b, 0x86, 0xdd, 0x50, 0x65}},
+    "Airplane"
+  },
+  { {0xf2833c22,{0x3592, 0x4a8a, 0x5693}, {0xee, 0x6c, 0x83, 0xb6, 0x3c, 0x19}},
+    "Amusement Recreation"
+  },
+  { {0x6f0317d6,{0x7fa3, 0x4dcc, 0x6187}, {0x7e, 0xca, 0xcb, 0x65, 0x49, 0x12}},
+    "Green Square"
+  },
+  { {0x18a6d3c0,{0x45cb, 0x4d19, 0xf5b9}, {0xc7, 0x9c, 0xbf, 0x8f, 0x6d, 0x46}},
+    "Red Triangle"
+  },
+  { {0x86e68ea7,{0xb9ab, 0x4bc8, 0xa1bf}, {0xc1, 0x22, 0x13, 0x97, 0x95, 0xe8}},
+    "Red Triangle and Green Square"
+  },
+  { {0x6afd74bf,{0x0ea5, 0x4680, 0xcd88}, {0x15, 0x87, 0x2f, 0x6c, 0xd2, 0xd8}},
+    "City 4"
+  },
+  { {0x49dfeb74,{0xbb09, 0x4df1, 0x5687}, {0xd8, 0xa0, 0xff, 0x36, 0x89, 0x3d}},
+    "White Square"
+  },
+  { {0x3eed62c6,{0xdab9, 0x42b0, 0xe4a3}, {0xd2, 0xf1, 0x7d, 0x54, 0xbf, 0x77}},
+    "White Triangle"
+  },
+  { {0x6b521940,{0x4492, 0x4c48, 0x58a0}, {0xfc, 0xd1, 0x1f, 0x5e, 0x0c, 0xea}},
+    "Red Black Diamond Flag"
+  },
+  { {0xbb8ebaa3,{0xac59, 0x4411, 0x9c94}, {0x30, 0xd4, 0xe1, 0x21, 0x25, 0x46}},
+    "Yellow Diamond Flag"
+  },
+  { {0x8e118862,{0xf6aa, 0x4b34, 0x2b82}, {0x8f, 0x3b, 0x5a, 0x2b, 0x59, 0xeb}},
+    "Small Pink Square"
+  },
+  { {0xd0ef64c2,{0xe319, 0x4876, 0x1b85}, {0x0e, 0x90, 0x50, 0x89, 0xb7, 0xc5}},
+    "Store"
+  },
+  { {0xa22b08fb,{0x6193, 0x4f5c, 0xdaa4}, {0xfa, 0xdf, 0xa7, 0x6e, 0x23, 0xe1}},
+    "Camping"
+  },
+  { {0x27f57c69,{0x575b, 0x4b56, 0x288c}, {0xe8, 0xe1, 0xc7, 0x05, 0x1f, 0x1f}},
+    "Green Diamond Flag"
+  },
+  { {0xe07abb38,{0x219f, 0x4b52, 0x868b}, {0x45, 0x0f, 0xbc, 0xc1, 0x4f, 0x6a}},
+    "Red Diamond Flag"
+  },
+  { {0x3a124ac9,{0x3973, 0x4e27, 0x4b82}, {0xa6, 0x3a, 0x94, 0x5c, 0xf8, 0xb3}},
+    "Red Green Diamond Flag"
+  },
+  { {0x64ed669b,{0x0db8, 0x4ec9, 0xd181}, {0x98, 0x50, 0xb3, 0x8b, 0x2f, 0x2e}},
+    "White Globe"
+  },
+  { {0x3cb10adc,{0xb090, 0x4960, 0x9f8a}, {0xec, 0xaf, 0x6c, 0xd7, 0xaa, 0x8b}},
+    "Yellow Globe"
+  },
+  { {0x2779347d,{0x17d4, 0x4021, 0xa6a8}, {0x51, 0x9a, 0xb6, 0xf8, 0x21, 0xff}},
+    ""
+  },
+  { {0x3ad63f7b,{0x4339, 0x427d, 0x5797}, {0xce, 0xa9, 0x96, 0x33, 0x8b, 0x3c}},
+    "Black Cross"
+  },
+  { {0x3e89481e,{0x35ff, 0x48b6, 0xc7ae}, {0xb0, 0x75, 0xf6, 0x43, 0xc4, 0xc7}},
+    "Church"
+  },
+  { {0x68622c10,{0x79b6, 0x466d, 0xa8a3}, {0x27, 0xc6, 0x25, 0x34, 0xfa, 0xa9}},
+    "Small Dark Green Square"
+  },
+  { {0x42c6a873,{0x2d0c, 0x46e7, 0x9989}, {0xdd, 0x86, 0x01, 0x6e, 0xa4, 0xc9}},
+    "Small Black Square"
+  },
+  { {0x50e3b06e,{0xbe81, 0x4b2c, 0x1f92}, {0x80, 0xa5, 0x72, 0x9b, 0x33, 0x05}},
+    "Danger"
+  },
+  { {0x369d0b22,{0xed07, 0x421f, 0x8780}, {0x33, 0x0e, 0xbd, 0x27, 0x4f, 0x3c}},
+    "Construction Business"
+  },
+  { {0x10603b6c,{0xb02e, 0x49ee, 0x60b9}, {0xed, 0x7e, 0x31, 0x16, 0x27, 0x89}},
+    "Airport"
+  },
+  { {0x8328aab7,{0xfe04, 0x46dc, 0x7bbf}, {0x29, 0x34, 0x30, 0xd3, 0x4d, 0xeb}},
+    "City 5"
+  },
+  { {0x96411287,{0xda33, 0x40e3, 0xaa9c}, {0x75, 0x83, 0x78, 0x2d, 0xa6, 0xf3}},
+    "USA"
+  },
+  { {0xb2f98627,{0x1211, 0x40e8, 0xb287}, {0x6d, 0x66, 0xfd, 0x15, 0x1e, 0xd4}},
+    "Diver Down"
+  },
+  { {0x3fce26d0,{0xfec6, 0x4f8b, 0x55a2}, {0x89, 0x3a, 0x8e, 0x59, 0x08, 0x0a}},
+    "Light Yellow Square"
+  },
+  { {0xb4b68597,{0x1aed, 0x4918, 0xd492}, {0x1f, 0xd1, 0x5e, 0xf2, 0x55, 0xc1}},
+    "Education Technology"
+  },
+  { {0x35d2e6a8,{0xda88, 0x4edb, 0x4b80}, {0x2b, 0x1b, 0xcf, 0xc0, 0xd4, 0x6d}},
+    "Computer"
+  },
+  { {0x4ddc4e96,{0x8d19, 0x4079, 0x4488}, {0xc0, 0x8f, 0x0f, 0x8e, 0xb5, 0xd7}},
+    "Amusement Recreation Red"
+  },
+  { {0x79f58929,{0x46c6, 0x4337, 0xc0b1}, {0xf0, 0x09, 0x55, 0xbb, 0x1f, 0xc3}},
+    "Telephone Red"
+  },
+  { {0x0083b377,{0xfb80, 0x4a83, 0x3593}, {0x56, 0xe5, 0xfe, 0xc4, 0xcd, 0x43}},
+    "Exit"
+  },
+  { {0x0c232891,{0xab4d, 0x440e, 0x7083}, {0x05, 0x63, 0x3a, 0xf5, 0x66, 0x11}},
+    "Exit with Services"
+  },
+  { {0xaf63e7c2,{0x03fa, 0x418e, 0xc68b}, {0x02, 0xb8, 0xf5, 0x61, 0xb6, 0x61}},
+    "Pizza"
+  },
+  { {0xd419c693,{0x39e6, 0x43db, 0xa1b8}, {0x7f, 0xcc, 0x2c, 0xb8, 0x51, 0x4a}},
+    "Financial Services"
+  },
+  { {0x70740a81,{0xe4ca, 0x4ac2, 0xa498}, {0x21, 0xc8, 0x5b, 0xc0, 0xb7, 0xae}},
+    "City 3"
+  },
+  { {0x9a582ff6,{0x34c4, 0x41c6, 0xf0a3}, {0x99, 0x69, 0x9d, 0xbe, 0x2e, 0x08}},
+    "Food Store"
+  },
+  { {0x3cd31689,{0x2f8f, 0x4fb0, 0xcb88}, {0x34, 0x84, 0xfc, 0x8b, 0x03, 0xe4}},
+    ""
+  },
+  { {0x952557a6,{0xe29e, 0x4512, 0x1184}, {0x1a, 0x3c, 0x9c, 0xd4, 0x83, 0x7d}},
+    ""
+  },
+  { {0x03dc278c,{0xe8ff, 0x46ac, 0x3daa}, {0x9f, 0xe9, 0x1e, 0xcf, 0x10, 0x35}},
+    "Driving Range"
+  },
+  { {0xacd28bab,{0x0ec0, 0x4393, 0xaf8b}, {0xbb, 0x5e, 0x74, 0xb3, 0x87, 0x12}},
+    "Golf Municipal"
+  },
+  { {0x984e7139,{0xeab8, 0x49f6, 0x55a0}, {0x8d, 0x51, 0xe6, 0xdd, 0xcc, 0xf4}},
+    "Golf Private"
+  },
+  { {0xec5828ab,{0x2a9d, 0x48f8, 0xd79b}, {0xc9, 0xc3, 0x30, 0x8e, 0xe4, 0xea}},
+    "Golf Public"
+  },
+  { {0xb0120d99,{0x683a, 0x4ecc, 0x129a}, {0x29, 0x94, 0x1f, 0x04, 0xae, 0x10}},
+    "Golf Resort"
+  },
+  { {0x2ce7685a,{0x6eaf, 0x4061, 0x29a5}, {0x87, 0x5e, 0xfa, 0x41, 0x75, 0x1a}},
+    "Golf Semi Private"
+  },
+  { {0x10397049,{0x9fc9, 0x4380, 0x5680}, {0x81, 0xd9, 0xe7, 0x43, 0x1f, 0x11}},
+    "Medical Service"
+  },
+  { {0x2fc28df6,{0xe806, 0x436e, 0xe0b9}, {0x46, 0x1d, 0xeb, 0xad, 0x56, 0x60}},
+    "Home Furnishings"
+  },
+  { {0x910313db,{0xafce, 0x4019, 0x1aa4}, {0xe6, 0x2c, 0xe6, 0xd1, 0xfd, 0xf7}},
+    "Industrial"
+  },
+  { {0x9e442c6e,{0xe12a, 0x4407, 0xd68a}, {0x1c, 0x5e, 0x19, 0xe7, 0xfe, 0x01}},
+    ""
+  },
+  { {0x37e2fe4a,{0xcd71, 0x413f, 0x0cad}, {0x81, 0xc5, 0x2c, 0xf4, 0x78, 0x79}},
+    ""
+  },
+  { {0x3c756e09,{0xb2dc, 0x48a6, 0x04a9}, {0x20, 0xb7, 0xc9, 0x9d, 0x14, 0x51}},
+    ""
+  },
+  { {0xa1245b1c,{0x156a, 0x48fc, 0x6f96}, {0xa5, 0xa3, 0x22, 0x54, 0x13, 0x97}},
+    "Manufacturing"
+  },
+  { {0x5bddbd7a,{0xf3cb, 0x454c, 0x06af}, {0x46, 0x1a, 0x68, 0xea, 0x60, 0x1a}},
+    "Note"
+  },
+  { {0xcb6777e1,{0xe0e0, 0x45ce, 0x309f}, {0x8d, 0x61, 0x7a, 0xd9, 0x89, 0xf5}},
+    "City"
+  },
+  { {0xbc168c08,{0x2b7f, 0x44be, 0x3883}, {0x81, 0x31, 0x4a, 0x09, 0xf5, 0x78}},
+    "Air Base"
+  },
+  { {0xa8857b0f,{0xfc3b, 0x4cd1, 0x9e91}, {0xf5, 0x3b, 0x21, 0xa8, 0x3b, 0xb9}},
+    "Battlefield"
+  },
+  { {0x06db55c1,{0xf687, 0x4840, 0x7c80}, {0x95, 0x58, 0x77, 0x8e, 0x5a, 0xdd}},
+    "Mining"
+  },
+  { {0xcc61b277,{0xa48c, 0x445a, 0xd9b9}, {0xe5, 0x91, 0x36, 0x18, 0x4e, 0x09}},
+    "Mountain"
+  },
+  { {0xfde13186,{0xb6cb, 0x4374, 0xc880}, {0x56, 0x99, 0xeb, 0x51, 0x68, 0x87}},
+    "Capital"
+  },
+  { {0xb14d90d1,{0xd943, 0x40ff, 0x9fb7}, {0x9b, 0x92, 0xd1, 0x23, 0xca, 0xef}},
+    "Route"
+  },
+  { {0x7eabc63f,{0x05d0, 0x4465, 0xb1b0}, {0x61, 0x2a, 0xf7, 0x4d, 0x0f, 0x4e}},
+    "Overnight"
+  },
+  { {0xac39d8b9,{0xfcdc, 0x4b50, 0x9ca6}, {0xea, 0x6c, 0x4b, 0xb5, 0x96, 0x0f}},
+    "Route End Active"
+  },
+  { {0xe1b9d86b,{0x95e6, 0x4bd8, 0xd880}, {0x7b, 0x6c, 0xc6, 0xd2, 0x00, 0x34}},
+    "Route End Inactive"
+  },
+  { {0x98712315,{0x7e1e, 0x4024, 0x8392}, {0xe3, 0xb8, 0x5a, 0x51, 0x45, 0xb4}},
+    "Fuel Stop"
+  },
+  { {0xe5ea5b38,{0x7b80, 0x4b42, 0x0aba}, {0x3d, 0x38, 0xf0, 0xe1, 0x17, 0x9a}},
+    "Route Start Active"
+  },
+  { {0x18fd0d49,{0x0a29, 0x433a, 0xd584}, {0xe5, 0xb7, 0x5b, 0xe8, 0x25, 0xbc}},
+    "Route Start Inactive"
+  },
+  { {0x2f52144b,{0x903e, 0x4dd9, 0x79af}, {0xe1, 0x66, 0x9b, 0xfc, 0xa9, 0xc1}},
+    "Route Stop Active"
+  },
+  { {0xfaf8d826,{0xd27d, 0x4316, 0x0e92}, {0xce, 0x8d, 0x85, 0x93, 0x4c, 0xf5}},
+    "Route Stop Inactive"
+  },
+  { {0xff44cae2,{0x707c, 0x4a1c, 0x43af}, {0x8b, 0xb6, 0xb1, 0x19, 0x9c, 0xf2}},
+    "Route Via"
+  },
+  { {0x5a50d59b,{0xc15b, 0x49c4, 0x9faa}, {0xc4, 0x1c, 0x4f, 0xe2, 0x95, 0x2a}},
+    "Radiation Green"
+  },
+  { {0x19556023,{0xb1e5, 0x4c9c, 0x49ba}, {0x08, 0x52, 0xa1, 0x24, 0x3d, 0x9f}},
+    "Radiation Red"
+  },
+  { {0xa54be251,{0x6688, 0x49fb, 0x60b3}, {0x89, 0x56, 0x37, 0x68, 0xc5, 0xb0}},
+    "Electricity"
+  },
+  { {0xd793ff0c,{0xfbe0, 0x4383, 0x3183}, {0xcf, 0x4f, 0x04, 0xb7, 0xee, 0x0a}},
+    "Personal Furnishings"
+  },
+  { {0x00f90733,{0x7ab5, 0x42cf, 0x468c}, {0xbf, 0x91, 0x27, 0xd3, 0xa8, 0x9c}},
+    "Personal Services"
+  },
+  { {0xea677f24,{0xbbe8, 0x4238, 0xee9c}, {0x6c, 0x0a, 0xec, 0x0e, 0x34, 0xf4}},
+    "Telephone Black"
+  },
+  { {0x2d8a05b5,{0x8baf, 0x4f28, 0xf58b}, {0xfb, 0x7f, 0x37, 0x34, 0x28, 0xa7}},
+    "Government Light"
+  },
+  { {0x40c64dfc,{0xc2d0, 0x4b0e, 0x6582}, {0x3f, 0x26, 0x9c, 0xcb, 0x6f, 0x1d}},
+    "Airport Red Square"
+  },
+  { {0xf27adb5d,{0x3629, 0x44c7, 0x95a2}, {0x25, 0x2c, 0x95, 0x24, 0x98, 0x2f}},
+    "Propeller Aircraft"
+  },
+  { {0x5a718e13,{0x3547, 0x42c5, 0x6d9d}, {0xb2, 0x82, 0xa5, 0x53, 0xbd, 0x3a}},
+    "Jet Aircraft"
+  },
+  { {0x0a471039,{0x2dfe, 0x447e, 0x54be}, {0xa3, 0x93, 0xae, 0x9a, 0xdd, 0xac}},
+    "Government"
+  },
+  { {0x4a59da2f,{0xe1c3, 0x42c3, 0x6ca1}, {0x06, 0xb9, 0x14, 0x1b, 0x89, 0x99}},
+    "USA Regional"
+  },
+  { {0xf16500a9,{0xa845, 0x4293, 0xae89}, {0x5c, 0x29, 0xbb, 0x0d, 0x06, 0xf7}},
+    "House 2"
+  },
+  { {0x7b05524d,{0xcb5a, 0x456f, 0x96b3}, {0x03, 0x61, 0x24, 0x54, 0x6a, 0x54}},
+    "Picnic"
+  },
+  { {0xb88ad7a1,{0xb94d, 0x42e8, 0x2b9d}, {0xf5, 0x4c, 0x2b, 0xff, 0x57, 0xdc}},
+    "Restaurant"
+  },
+  { {0xdc48a20a,{0x54a2, 0x4c61, 0x1fbe}, {0x02, 0x74, 0x5b, 0xe9, 0x18, 0x99}},
+    "Store 2"
+  },
+  { {0x6b5ab040,{0x96df, 0x46ae, 0xacb8}, {0xe4, 0x47, 0x66, 0x3f, 0xec, 0x9b}},
+    ""
+  },
+  { {0x153b2cff,{0x6232, 0x4294, 0xd59a}, {0xc5, 0xa0, 0x7b, 0xe0, 0x16, 0xeb}},
+    "Blue Star"
+  },
+  { {0xf276f6b3,{0x586a, 0x4bf8, 0x2f82}, {0xf2, 0x69, 0xe3, 0x76, 0x7e, 0xd5}},
+    ""
+  },
+  { {0x91d242c8,{0x0986, 0x4fad, 0x8286}, {0xec, 0x79, 0x79, 0xcd, 0xab, 0x02}},
+    "Running"
+  },
+  { {0x8b0078db,{0x6ee0, 0x4caa, 0xd3b5}, {0xfe, 0xe1, 0xc2, 0xbf, 0x94, 0x7d}},
+    "Transportation"
+  },
+  { {0x0599f6c9,{0x478e, 0x4f63, 0x78a5}, {0xed, 0x31, 0xb5, 0xae, 0xda, 0x89}},
+    "Fishing 2"
+  },
+  { {0x7389128c,{0x0e78, 0x4d5d, 0x4189}, {0xb8, 0xf3, 0xb5, 0xbd, 0x70, 0xb1}},
+    "Automotive"
+  },
+  { {0x0362b593,{0x3df6, 0x48ed, 0xc489}, {0x85, 0x13, 0xc1, 0xc0, 0xb9, 0x0d}},
+    "Cloudy"
+  },
+  { {0xf0717a94,{0xd048, 0x4770, 0x9bab}, {0x80, 0x09, 0xbd, 0x4b, 0x1e, 0x75}},
+    "Partly Cloudy"
+  },
+  { {0x14486bbc,{0xae6b, 0x44ea, 0xd6b9}, {0xbf, 0x9a, 0x39, 0x7a, 0x51, 0x6c}},
+    "Mostly Cloudy"
+  },
+  { {0x7a258c70,{0xabec, 0x4cff, 0x4983}, {0x84, 0xdc, 0x2f, 0x2e, 0xff, 0x28}},
+    "Hurricane"
+  },
+  { {0xeff260d4,{0x46d5, 0x4fb5, 0xc79c}, {0x5e, 0x06, 0xc8, 0xab, 0x7a, 0x2b}},
+    "Lightning"
+  },
+  { {0xc3d70220,{0x5154, 0x4766, 0xf0af}, {0xdf, 0x86, 0x74, 0x40, 0x5f, 0x8c}},
+    "Rain"
+  },
+  { {0xf2dfbc91,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Blue Flag"
+  },
+  { {0xf2dfbc92,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dark Blue Flag"
+  },
+  { {0xf2dfbc93,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Brown Flag"
+  },
+  { {0xf2dfbc94,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Yellow Flag"
+  },
+  { {0xf2dfbc95,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Red Flag 2"
+  },
+  { {0xf2dfbc96,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dark Red Flag"
+  },
+  { {0xf2dfbc97,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dark Green Flag"
+  },
+  { {0xf2dfbc98,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Green Flag"
+  },
+  { {0xf2dfbc99,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Blue-Green Flag"
+  },
+  { {0xf2dfbc9a,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Light Blue Flag"
+  },
+  { {0x623e1ee1,{0xaf27, 0x100f, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Dark Blue Map Pin"
+  },
+  { {0xf2dfbc9d,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Blue Map Pin"
+  },
+  { {0xf2dfbc9e,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Yellow Map Pin"
+  },
+  { {0xf2dfbc9f,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Brown Map Pin"
+  },
+  { {0xf2dfbca0,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Red Map Pin"
+  },
+  { {0xf2dfbca1,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dark Red Map Pin"
+  },
+  { {0xf2dfbca2,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Green Map Pin"
+  },
+  { {0xf2dfbca3,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dark Green Map Pin"
+  },
+  { {0xf2dfbca4,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Gray Map Pin"
+  },
+  { {0xf2dfbca5,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dark Gray Map Pin"
+  },
+  { {0xd1703de0,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Green Dot"
+  },
+  { {0xd1703de1,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dark Green Dot"
+  },
+  { {0xd1703de2,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Blue Dot"
+  },
+  { {0xd1703de3,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dark Blue Dot"
+  },
+  { {0xd1703de5,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Red Dot"
+  },
+  { {0x45c088e0,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Dark Red Dot"
+  },
+  { {0x45c088e1,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Yellow Dot"
+  },
+  { {0x45c088e2,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Brown Dot"
+  },
+  { {0x45c088e3,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Light Blue Dot"
+  },
+  { {0xbde3a8a1,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Blue-Green Dot"
+  },
+  { {0xbde3a8a2,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Green Dot"
+  },
+  { {0xbde3a8a3,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Dark Green Dot"
+  },
+  { {0xbde3a8a4,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Blue Dot"
+  },
+  { {0xbde3a8a5,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Dark Blue Dot"
+  },
+  { {0xbde3a8a6,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Red Dot"
+  },
+  { {0xbde3a8a7,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Dark Red Dot"
+  },
+  { {0xbde3a8a8,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Yellow Dot"
+  },
+  { {0xbde3a8a9,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Brown Dot"
+  },
+  { {0xbde3a8aa,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Light Blue Dot"
+  },
+  { {0xbde3a8ab,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+    "Small Blue-Green Dot"
+  },
+  { {0x623e1ee0,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Red Flag"
+  },
+  { {0x623e1ee1,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Map Pin"
+  },
+  { {0x623e1ee2,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Yellow Square"
+  },
+  { {0x623e1ee3,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Red X"
+  },
+  { {0x623e1ee4,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Blue Circle"
+  },
+  { {0x623e1ee5,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "House"
+  },
+  { {0x623e1ee7,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Triangle"
+  },
+  { {0x623e1ee8,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+    "Green Star"
+  },
+  { {0x9d277805,{0xe2f8, 0x4f43, 0x3f97}, {0x35, 0x0d, 0x40, 0xae, 0x5c, 0xd3}},
+    "Geocache"
+  },
+  { {0xcb8aad04,{0xcc2d, 0x47f2, 0x428a}, {0x80, 0xf7, 0xd6, 0x68, 0xed, 0x32}},
+    "Geocache Found"
+  },
+  { {0x7341c1f4,{0xdecd, 0x4d35, 0x45a5}, {0x52, 0x25, 0x5e, 0xbf, 0xe6, 0x51}},
+    "Tent"
+  },
+  { {0x835b84e2,{0xf10c, 0x45cb, 0x958f}, {0x18, 0x3a, 0xc2, 0x2a, 0xe5, 0x28}},
+    "Tipup Up"
+  },
+  { {0xce06fc92,{0xbb0c, 0x4ec1, 0xda93}, {0x64, 0x4a, 0x60, 0xbe, 0x40, 0x90}},
+    "Topup Down"
+  },
+};
+
+static int FindIconByName(const char* name, guid_t* guid)
+{
+  for (unsigned int i = 0; i < (sizeof(default_guids)/sizeof(struct defguid)); ++i) {
+    if (!case_ignore_strcmp(name, default_guids[i].name)) {
+      *guid = default_guids[i].guid;
+      return 1;
+    }
+  }
+  return 0;
+}
+
+static int FindIconByGuid(const guid_t* guid, const char** name)
+{
+  for (unsigned int i = 0; i < (sizeof(default_guids)/sizeof(struct defguid)); ++i) {
+    /* don't compare any structure padding */
+    if ((guid->l == default_guids[i].guid.l) &&
+        memcmp(guid->s, default_guids[i].guid.s, sizeof(guid->s)) &&
+        memcmp(guid->c, default_guids[i].guid.c, sizeof(guid->c))) {
+      *name = default_guids[i].name;
+      return 1;
+    }
+  }
+  return 0;
+}
diff --git a/deprecated/netstumbler.cc b/deprecated/netstumbler.cc
new file mode 100644 (file)
index 0000000..53d724e
--- /dev/null
@@ -0,0 +1,348 @@
+/*
+    Read Netstumbler data files.
+
+    Copyright (C) 2004-2020 Robert Lipe, robertlipe+source@gpsbabel.org and
+    John Temples; gpsns@xargs.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+ */
+
+#include <QtCore/QDate>      // for QDate
+#include <QtCore/QDateTime>  // for QDateTime
+#include <QtCore/QString>    // for QString
+#include <QtCore/QTime>      // for QTime
+#include <QtCore/QVector>    // for QVector
+#include <QtCore/Qt>         // for UTC
+#include <cctype>            // for isspace
+#include <cstdio>            // for snprintf
+#include <cstdlib>           // for atof, atoi, qsort, strtol
+#include <cstring>           // for strcpy, strlen, strncmp, strstr
+#include "cet_util.h"        // for cet_convert_init
+#include "csv_util.h"        // for csv_lineparse
+#include "defs.h"            // for arglist_t, Waypoint, ff_cap, WaypointList, ff_cap_none, ddmm2degrees, ARG_NOMINMAX, ARGTYPE_STRING, ff_cap_read, get_crc32, lrtrim, waypt_add, xfree, xmalloc, ff_type_file, ARGTYPE_BOOL, CET_CHARSET_ASCII, CET_CHARSET_UTF8, CSTR, NULL_POS_OPS, ff_vecs_t
+#include "gbfile.h"          // for gbfclose, gbfgetstr, gbfopen, gbfile
+
+static gbfile* file_in;
+static char* nseicon = nullptr;
+static char* nsneicon = nullptr;
+static char* seicon = nullptr;
+static char* sneicon = nullptr;
+static char* snmac = nullptr;
+static int macstumbler;
+
+static void    fix_netstumbler_dupes(const WaypointList*);
+
+#define MYNAME "NETSTUMBLER"
+
+static
+QVector<arglist_t> netstumbler_args = {
+  {
+    "nseicon", &nseicon, "Non-stealth encrypted icon name",
+    "Red Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+  {
+    "nsneicon", &nsneicon, "Non-stealth non-encrypted icon name",
+    "Green Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+  {
+    "seicon", &seicon, "Stealth encrypted icon name",
+    "Red Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+  {
+    "sneicon", &sneicon, "Stealth non-encrypted icon name",
+    "Green Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+  },
+  {
+    "snmac", &snmac, "Shortname is MAC address", nullptr, ARGTYPE_BOOL,
+    ARG_NOMINMAX, nullptr
+  },
+};
+
+static void
+rd_init(const QString& fname)
+{
+  file_in = gbfopen(fname, "rb", MYNAME);
+  macstumbler = 0;
+}
+
+static void
+rd_deinit()
+{
+  gbfclose(file_in);
+}
+
+static void
+data_read()
+{
+  char* ibuf;
+  char ssid[2 + 32 + 2 + 1];                   /* "( " + SSID + " )" + null */
+  char mac[2 + 17 + 2 + 1];                    /* "( " + MAC + " )" + null */
+  QString desc;
+  double lat = 0, lon = 0;
+  int line_no = 0;
+  int stealth_num = 0, whitespace_num = 0;
+  long flags = 0;
+  int speed = 0, channel = 0;
+  int line = 0;
+  WaypointList tmp_waypt_list;
+  QDate date;
+  QTime time;
+
+  while ((ibuf = gbfgetstr(file_in))) {
+    int len;
+    int stealth = 0;
+
+
+    if ((line++ == 0) && file_in->unicode) {
+      cet_convert_init(CET_CHARSET_UTF8, 1);
+    }
+    ibuf = lrtrim(ibuf);
+    /* A sharp in column zero might be a comment.  Or it might be
+     * something useful, like the date.
+    */
+
+    if (ibuf[0] == '#') {
+      if (strncmp(&ibuf[2], "$DateGMT:", 9) == 0) {
+        date = QDate::fromString(ibuf + 12, "yyyy-MM-dd");
+      }
+
+      /*
+       * Mac stumbler files are the same, except
+       * use DDMM.mmm instead of DD.DDDD.
+       */
+      if (strstr(ibuf, "Creator: MacStumbler")) {
+        macstumbler = 1;
+      }
+
+      continue;
+    }
+
+    int field_num = 0;
+    line_no++;
+    char* field = csv_lineparse(ibuf, "\t", "", line_no);
+
+    while (field) {
+      switch (field_num) {
+      case 0:                          /* lat */
+        lat = atof(&field[2]);
+        if (field[0] == 'S') {
+          lat = -lat;
+        }
+        if (macstumbler) {
+          lat = ddmm2degrees(lat);
+        }
+        break;
+
+      case 1:                          /* long */
+        lon = atof(&field[2]);
+        if (field[0] == 'W') {
+          lon = -lon;
+        }
+        if (macstumbler) {
+          lon = ddmm2degrees(lon);
+        }
+        break;
+
+      case 2:                          /* ( SSID ) */
+        strcpy(ssid, &field[2]); /* zap "( " */
+        len = strlen(ssid) - 2;
+        ssid[len] = 0;          /* zap " )" */
+        stealth = (len == 0);
+        /* don't alter SSID in snmac mode */
+        if (!snmac) {
+          int found = 0;
+          /* check for all whitespace */
+          for (int i = 0; i < len && !found; i++) {
+            if (!isspace(ssid[i])) {
+              found = 1;
+            }
+          }
+
+          if (!stealth && !found) {
+            snprintf(ssid, sizeof ssid, "Whitespace/%d", ++whitespace_num);
+          }
+        }
+        break;
+
+      case 4:                  /* ( MAC address ) */
+        strcpy(mac, &field[2]);        /* zap "( " */
+        mac[strlen(mac) - 2] = 0;/* zap " )" */
+        break;
+
+      case 5:                  /* time */
+        time = QTime::fromString(field, "hh:mm:ss");
+        break;
+
+      case 8:                                  /* flags */
+        flags = strtol(field, nullptr, 16);
+        break;
+
+      case 11:                         /* data rate */
+        speed = atoi(field) / 10;
+        break;
+
+      case 12:                         /* last channel */
+        channel = atoi(field);
+        break;
+
+      case 3:                  /* type */
+      case 6:                  /* SNR/sig/noise */
+      case 7:                  /* name */
+      case 9:                  /* channel bits */
+      case 10:         /* beacon interval */
+      default:
+        break;
+      }
+
+      field_num++;
+      field = csv_lineparse(nullptr, "\t", "", line_no);
+    }
+
+    if (lat == 0 && lon == 0) {        /* skip records with no GPS data */
+      continue;
+    }
+
+    auto* wpt_tmp = new Waypoint;
+
+    if (stealth) {
+      if (!snmac) {
+        snprintf(ssid, sizeof ssid, "Stealth/%d", ++stealth_num);
+      }
+
+      if (flags & 0x0010) {    /* encrypted? */
+        wpt_tmp->icon_descr = seicon;
+      } else {
+        wpt_tmp->icon_descr = sneicon;
+      }
+    } else {
+      if (flags & 0x0010) {    /* encrypted? */
+        wpt_tmp->icon_descr = nseicon;
+      } else {
+        wpt_tmp->icon_descr = nsneicon;
+      }
+    }
+
+    if (snmac) {
+      desc = QString("%1/%2 Mbps/Ch %3").arg(ssid).arg(speed).arg(channel);
+      wpt_tmp->shortname = (mac);
+    } else {
+      desc = QString("%1 Mbps/Ch %2/%3").arg(speed).arg(channel).arg(mac);
+      wpt_tmp->shortname = (ssid);
+    }
+
+    wpt_tmp->description = desc;
+    wpt_tmp->longitude = lon;
+    wpt_tmp->latitude = lat;
+    wpt_tmp->SetCreationTime(QDateTime(date, time, Qt::UTC));
+
+    tmp_waypt_list.waypt_add(wpt_tmp);
+  }
+
+  fix_netstumbler_dupes(&tmp_waypt_list);
+
+  for (Waypoint* wpt : tmp_waypt_list) {
+    waypt_add(wpt);
+  }
+}
+
+struct htable_t {
+  unsigned long crc;
+  Waypoint* wpt;
+};
+
+static
+int
+compare(const void* a, const void* b)
+{
+  unsigned long crc_a = ((const htable_t*)a)->crc;
+  unsigned long crc_b = ((const htable_t*)b)->crc;
+
+  /* we can't just return crc_a - crc_b because the return type is
+   * signed.
+   * */
+
+  if (crc_a < crc_b) {
+    return -1;
+  } else if (crc_a > crc_b) {
+    return 1;
+  } else {
+    /* CRCs are equal; we need to subsort on the description (which
+     * includes the MAC address) to guarantee the same ordering of
+     * the output for any qsort() implementation.  this is strictly
+     * to make the testo script happy.
+     * */
+
+    Waypoint* wpt_a = ((const htable_t*)a)->wpt;
+    Waypoint* wpt_b = ((const htable_t*)b)->wpt;
+    return wpt_a->description.compare(wpt_b->description);
+  }
+}
+
+/* netstumbler data will have a lot of duplicate shortnames if the SSID
+ * is used as the shortname (the default).  salvage the dupes by
+ * synthesizing a (hopefully) unique shortname.
+ * */
+
+static
+void
+fix_netstumbler_dupes(const WaypointList* waypt_list)
+{
+  int ct = waypt_list->count(), serial = 0;
+  unsigned long last_crc;
+
+  auto* htable = (htable_t*) xmalloc(ct * sizeof(htable_t));
+  htable_t* bh = htable;
+
+  int i = 0;
+  for (Waypoint* waypointp : *waypt_list) {
+    bh->wpt = waypointp;
+    QString snptr = bh->wpt->shortname;
+    QString tmp_sn = snptr.toLower();
+    bh->crc = get_crc32(CSTR(tmp_sn), tmp_sn.length());
+    i ++;
+    bh ++;
+  }
+
+  qsort(htable, ct, sizeof *htable, compare);
+
+  last_crc = htable[0].crc + 1;                /* force mismatch */
+
+  for (i = 0, bh = htable; i < ct; i++, bh++) {
+    if (last_crc == bh->crc) {
+      bh->wpt->shortname += QString("/%1").arg(++serial);
+    } else {
+      last_crc = bh->crc;
+    }
+  }
+
+  xfree(htable);
+}
+
+ff_vecs_t netstumbler_vecs = {
+  ff_type_file,
+  { ff_cap_read, ff_cap_none, ff_cap_none },
+  rd_init,
+  nullptr,
+  rd_deinit,
+  nullptr,
+  data_read,
+  nullptr,
+  nullptr,
+  &netstumbler_args,
+  CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+  , NULL_POS_OPS,
+  nullptr
+};
diff --git a/intdoc/SA2003_an1_dump.pl b/intdoc/SA2003_an1_dump.pl
deleted file mode 100644 (file)
index 70d02a3..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/usr/bin/perl
-
-=pod
-
-  This script reads a DeLorme Street Atlas 2003 .an1 (drawing) file 
-  and prints various pertinent data from it.  Anything with a variable 
-  name starting with "unk" or "magic" or "zero" is probably something 
-  we don't yet understand.  Suggestions as to what some of these fields 
-  mean are welcome.  The author disclaims any liability arising from 
-  the use of any information contained within this script. 
-
-    Copyright (C) 2005 Ronald L. Parker (babelan1perl@parkrrrr.com)
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-=cut
-
-# Convert a longword to a latitude or longitude
-sub decode {
-   my $foo = shift;
-
-   my $intermed = 0x80000000-$foo;
-   my $deg = $intermed/(0x800000);
-   sprintf( "%8.8x %8.8x %d %06.3f", $foo, $intermed, $deg, 60*($deg-int($deg)));
-}
-
-
-# read a data structure from the input file.  
-sub shiftunpack {
-
-   my $pattern = shift;
-   my @result = unpack( $pattern, $file );
-   my $str = pack( $pattern, @result );
-   $file = substr( $file, length( $str ));
-   @result;
-}
-
-sub skip_bytes {
-   my $count = shift;
-   $file = substr( $file, $count );
-}
-
-sub decodeGuid {
-   ($a, $b, $c, $d, $e, $f, $g, $h, $i, $j) = unpack( 'LSSSCCCCCC', shift );
-   sprintf( '%8.8x-%4.4x-%4.4x-%4.4x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x',$a, $b, $c, $d, $e, $f, $g, $h, $i, $j);
-}
-
-# read file
-undef $/;
-$file = <>;
-
-@filetypes = qw( drawing road trail waypoint track );
-
-# read file header
-($magic, $filetype ) = shiftunpack( 'ss' );
-
-print <<END;
-MAGIC   $magic
-$filetypes[$filetype] layer
-
-END
-
-# read bitmap info
-($bitmapcount) = shiftunpack( 'l' );
-
-while ( $bitmapcount ) {
-  ($rec_type) = shiftunpack( 's' );
-  if ( $rec_type == 0x4c49 ) { # 'IL'
-    # This is a Windows ImageList stream.  It actually includes the
-    # 'BM' structures following in the stream, so we could be smarter
-    # about how many we expect to find. (2 if bit 0 of ilflags is set,
-    # 1 otherwise.  That bit is ILC_MASK.) For now, though, this works 
-    # just fine.  Newer versions of the IL structure supposedly contain
-    # more overlay indices, but SA always seems to use the 0x101 version.
-
-    # Documentation on the stream format is hard to come by.  I found
-    # mine in the form of the WINE project's reimplementation of comctl32r:
-
-    # http://cvs.winehq.org/cvsweb/wine/dlls/comctl32/#dirlist
-    # typedef struct _ILHEAD
-    # {
-    #     USHORT       usMagic;         (RLP: this is 'IL', 0x4c49)
-    #     USHORT       usVersion;       (RLP: SA likes 0x0101)
-    #     WORD         cCurImage;       (RLP: image count)
-    #     WORD         cMaxImage;       (RLP: max before grow)
-    #     WORD         cGrow;
-    #     WORD         cx;
-    #     WORD         cy;
-    #     COLORREF     bkcolor;         (RLP: DWORD, 0x00bbggrr)
-    #     WORD         flags;           (RLP: ILC_*; See below)
-    #     SHORT                ovls[4];
-    # } ILHEAD;
-
-    # #define ILC_MASK                0x00000001
-    # #define ILC_COLOR               0x00000000
-    # #define ILC_COLORDDB            0x000000FE
-    # #define ILC_COLOR4              0x00000004
-    # #define ILC_COLOR8              0x00000008
-    # #define ILC_COLOR16             0x00000010
-    # #define ILC_COLOR24             0x00000018
-    # #define ILC_COLOR32             0x00000020
-    # See Windows SDK ImageList_Create for the meanings of these flags.
-    # Street Atlas appears to use ILC_COLOR32, both with and without ILC_MASK.
-    # * The format is like this:
-    # *        ILHEAD                  ilheadstruct;
-    # *
-    # * for the color image part:
-    # *        BITMAPFILEHEADER        bmfh;
-    # *        BITMAPINFOHEADER        bmih;
-    # * only if it has a palette:
-    # *        RGBQUAD                 rgbs[nr_of_paletted_colors];
-    # *
-    # *        BYTE                    colorbits[imagesize];
-    # *
-    # * the following only if the ILC_MASK bit is set in ILHEAD.ilFlags:
-    # *        BITMAPFILEHEADER        bmfh_mask;
-    # *        BITMAPINFOHEADER        bmih_mask;
-    # * only if it has a palette (it usually does not):
-    # *        RGBQUAD                 rgbs[nr_of_paletted_colors];
-    # *
-    # *        BYTE                    maskbits[imagesize];
-    # *
-    # * CAVEAT: Those images are within a NxM bitmap, not the 1xN we expect.
-
-    ($ilVersion, $ilCount, $ilMax, $ilGrow, $ilcx, $ilcy,
-       $ilbkColor, $ilflags, $ilovl1, $ilovl2, $ilovl3, $ilovl4 ) =
-    shiftunpack( 'sssssslsssss' );
-    printf( "ver %x count %d   max %d grow %d   cx %d cy %d  bkcolor %x  flags %x\n", $ilVersion, $ilCount, $ilMax, $ilGrow, $ilcx, $ilcy, $ilbkColor, $ilflags );
-  }
-  elsif ( $rec_type == 0x4d42 ) { # 'BM'
-    # This is a standard BMP file, documented in MSDN.
-    # BITMAPFILEHEADER
-    ($fhsize, $res_0_1, $res_0_2, $bitoffset) = shiftunpack( 'lssl' );
-    # BITMAPINFOHEADER
-    ($bmisize, $width, $height, $planes, $bpp, $compression, 
-     $size, $xppm, $yppm, $colused, $colimprt ) = shiftunpack( 'lllssllllll');
-    # palette
-    $palettesize = $bitoffset - $bmisize - 14; # 14 bytes in BMFH, including the 'BM'
-
-    open BMP, ">bitmap$filecount.bmp";
-    binmode BMP;
-    print BMP 'BM';
-    $head = pack('lssl', ($fhsize,  $res_0_1, $res_0_2, $bitoffset));
-    print BMP $head;
-    $head = pack('lllssllllll', ($bmisize, $width, $height, $planes, $bpp,
-            $compression, $size, $xppm, $yppm, $colused, $colimprt));
-    print BMP $head;
-    print BMP substr($file, 0, $palettesize+$size);
-    close BMP;
-    $filecount++;
-
-    skip_bytes( $palettesize );
-    # image
-    skip_bytes( $size );
-  }
-  else {
-    # image information - the 'type' we read was actually the low word of the hotspot X coord.
-    ($hotspotxhi, $hotspoty, $unk1, $guid, $name ) = shiftunpack( 'slla[16]C/a*' );
-
-    # fix the hotspot X coord
-    $hotspotx = $rec_type + 0x10000*$hotspotxhi;
-
-    printf( "Image: %2d %2d %s %x $name\n", $hotspotx, $hotspoty, decodeGuid( $guid ), $unk1 );
-    $imagenames{$guid} = $name;
-    $bitmapcount--; 
-  }
-} 
-
-# waypoint information
-
-($magic, $wptcount) = shiftunpack( 'sl' );
-
-@types = qw(none marker line polygon text circle mapnote highlight 
-            unknown8 arc spline rectangle unknown12 unknown13 road 
-            trail track waypoint photo);
-
-print( "$wptcount waypoints\n" );
-while ( $wptcount ) {
-
-  ($magic, $unk1, $lon, $lat, $type, $height, $width, $unk2, $unk3, $serial, 
-   $unk4, $create_zoom, $visible_zoom, $unk5, $circle_radius, $name, $font, 
-   $guid, $fontcolor, $fontstyle, $fontsize, $outlineweight, $outlinecolor, 
-   $outlineflags, $fillcolor, $unk6, $fillflags ) = 
-   shiftunpack( 'slllsllssssCCsds/a*s/a*a[16]lllllllll' );
-
-   # fontcolor is BGR (i.e. pure blue is 0xff00000, pure red is 0x0000ff)
-   # fontstyle is 0x10-bold, 0x20-italic, 0x80-underline
-
-   # width/height are in pixels for mapnotes and represent the offset of the 
-   #     mapnote from the point (i.e. the dimensions of the tail.)
-   # width/height are in degrees times 0x800000 for rectangles
-
-   # circle_radius is in kilometers.
-
-   # Note that type appears to be shared with lines.
-   # type   desc
-   #   1     marker (flag, dot, etc.)
-   #   4     text
-   #   5     circle
-   #   6     mapnote
-   #  11     rectangle
-   #  17     waypoint
-   #  18     photo
-
-   
-
-  $lat = decode( $lat );
-  $lon = decode( $lon );
-
-  $rect_height = $height/0x800000;
-  $rect_width = $width/0x800000;
-
-  printf ( "$magic -- %x %x %x %x %x %x %x %x %x -- $type $types[$type]  $lat  $lon  %s $imagenames{$guid}  '$name'\n", 
-      $unk1,  $unk2,  $unk3,  $unk4,  $unk5,  $unk6,  decodeGuid( $guid ) );
-
-       printf ("   %d height   %d width   %x fill %x outline %x fillstyle font %s\n", $height, $width, $fillcolor, $outlinecolor, $fillflags, $font);
-
-  $wptcount--;
-} 
-
-# line information
-($magic, $linecount ) = shiftunpack( 'sl' );
-print ( "$linecount lines\n" );
-while ( $linecount ) {
-  ($magic, $unk1, $serial, $unk2, $unk3, $type, $unk4, $name, $lineweight, $linestyle, 
-   $linecolor, $unk5, $polyfillcolor, $unk6, $unk7, $unk8, $pointcount ) = 
-    shiftunpack( 'ssslssls/a*sllllllsl' );
-
-   # arcs are 4-point (3-segment) lines: start, third point, end, center (yes, that's overdetermined.)
-
-   # Note that type appears to be shared with points.
-   # type   desc
-   #   2     line
-   #   3     polygon
-   #   7     highlight
-   #   9     arc
-   #  10     spline
-   #  14     routable road
-   #  15     trail
-   #  16     track
-
-   printf ("--- start line ---   %.4x  %x %x %x %x %x %x %x %x -- $type $types[$type] '$name'\n", $magic,
-               $unk1, $unk2, $unk3, $unk4, $unk5, $unk6, $unk7, $unk8 );
-  while ( $pointcount ) {
-    ($magic, $unk0, $lon, $lat, $unk0s ) = shiftunpack( 'sllls' );
-    $lat = decode( $lat );
-    $lon = decode( $lon );
-    printf (" $magic   $lat   $lon   %x %x\n", $unk0, $unk0s);
-    $pointcount--;
-  }
-  print "--- end line ---\n";
-  $linecount--;
-}
-
diff --git a/intdoc/an1_road_types.txt b/intdoc/an1_road_types.txt
deleted file mode 100644 (file)
index fe3cb23..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-
-04xx Limited Access
-08xx Primary
-0Cxx Secondary
-10xx Local Road
-
-Axes:
-  Toll/Limited/Primary/Secondary/Connecting/Local/-
-  Interstate/US/State/County/Farm/Indian/Urban/Forest/Ranch/Ferry/Exit/Minor/-
-  Unimproved/Under Construction/Approximation/-
-
-1107 ....  
-
-0410 Primary Limited Access                    Limited - -
-0420 Primary Limited Access Toll               Toll - - 
-0430 Interstate                                Limited Interstate -
-0440 Interstate Toll                           Toll Interstate -
-0450 Interstate Under Construction             Limited Interstate Const
-0460 State Route Primary Limited Access        Limited State - 
-0470 State Route Toll                          Toll State -
-0480 US Route Primary Limited Access           Limited US - 
-0490 US Route Toll                             Toll US -
-
-0810 Primary Non Limited Access                Primary - -
-0820 Interstate Business Route                 Primary Interstate -
-0830 Primary Under Construction                Primary - Const
-0840 State Route                               - State -
-0850 State Route Under Construction            - State Const
-0860 State Route Primary                       Primary State -
-0870 US Route                                  Primary US -
-0880 US Route Under Construction               Primary US Const
-
-0C10 Secondary State                           Secondary State - 
-0C20 Secondary                                 Secondary - - 
-0C30 Connecting Road                           Connecting - -
-0C40 County Route Connecting Road              Connecting County -
-0C50 Farm Route Connecting Road                Connecting Farm - 
-0C60 Indian Route Connecting Road              Connecting Indian - 
-0C70 Urban Connecting Road                     Connecting Urban - 
-0C80 Forest Connecting Road                    Connecting Forest - 
-0C90 Ranch Route Connecting Road               Connecting Ranch - 
-0CA0 Ferry Crossing Connecting Road            Connecting Ferry - 
-0CB0 Exit COnnecting Road                      Connecting Exit - 
-0CC0 Minor Connecting Road                     Connecting Minor - 
-0CD0 Unimproved Connecting Road                Connecting - Unimproved
-0CE0 Forest Secondary Road                     Secondary Forest - 
-
-1010 Local or Rural Road                       Local - - 
-1020 Local Road Approximation                  Local - Approx 
-1030 Ferry Crossing Local Road                 Local Ferry - 
-1040 Unimproved Local Road                     Local - Unimproved
-
diff --git a/naviguide.cc b/naviguide.cc
deleted file mode 100644 (file)
index 648e64e..0000000
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
-    Naviguide Routes
-
-
-    Copyright (C) 2009 Erez Zuler
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
- */
-
-#include "defs.h"
-#include "csv_util.h"
-#include "jeeps/gpsmath.h"
-#include <QtCore/QDebug>
-#include <QtCore/QTextCodec>
-#include <cmath>
-
-#define MYNAME        "Naviguide"
-
-
-/************* Specific Naviguide data formats ****************/
-
-/* Naviguide file header */
-struct ng_file_header_t {
-  uint16_t nof_wp;    /* Little endean format */
-  unsigned char pad1[6];      /* 0xff, 0xff, 0x01, 0x00, 0x06, 0x00 */
-  char signature[9]; /* cWaypoint */
-  unsigned char pad2[4];      /* 0x01, 0x00, 0x00, 0x00 */
-};
-
-/* Naviguide waypoint/rout data  */
-struct ng_wp_data_t {
-  unsigned char pad1[8];   /*  0xfe, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 */
-  /* coordination are in old israeli grid */
-  int32_t East;
-  int32_t North;
-  unsigned char pad2[2];  /* 0x01, 0x01 */
-  uint32_t Alt;
-  char CommentLength;
-};
-
-struct ng_next_wp_t {
-  unsigned char pad1[2]; /* 0x01, 0x80 */
-  uint16_t next_wp;
-  unsigned char pad2[2]; /* 0x00, 0x00 */
-};
-
-struct ng_wp_no_comment_t {
-  unsigned char chHeaderLen;
-  char strName[255];
-  ng_wp_data_t wp_data;
-};
-
-
-/* Global variables */
-
-static gbfile* file_in, *file_out;
-static uint16_t nof_wp;
-static route_head* rte_head;
-static ng_file_header_t ng_file_header;
-static ng_wp_no_comment_t WPNC;
-static ng_next_wp_t ng_next_wp;
-static char strComment[101];
-
-/* Process options */
-/* wp - process only waypoints */
-/* rte - process as route */
-/* wprte - Process waypoints and route */
-static char* process = nullptr;
-static char* reorder = nullptr;
-static int process_rte = 1;
-static int reorder_wp = 0;
-
-static char temp_short_name[5];
-
-
-
-
-/* Forward declarations */
-static void ng_read_file_header();
-
-static
-QVector<arglist_t> ng_args = {
-  {
-    "output", &process, "'wp' - Create waypoint file , 'rte' - Create route file",
-    "rte", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "reorder", &reorder, "'n' - Keep the existing wp name, 'y' - rename waypoints",
-    "n", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-
-};
-
-/*===================Utilities ==========================================*/
-
-static void
-ng_convert_datum(Waypoint* wpt)
-{
-  double lat, lon;
-
-  auto east = (double) WPNC.wp_data.East;
-  auto north = (double) WPNC.wp_data.North;
-  auto alt = (double) WPNC.wp_data.Alt;
-
-  GPS_Math_ICS_EN_To_WGS84(east, north, &lat, &lon);
-  wpt->latitude = lat;
-  wpt->longitude = lon;
-  wpt->altitude = alt;
-}
-
-
-
-/*=================== File read/write utilities ==========================================*/
-
-static void
-ng_fwrite_wp_data(const QString& s, const QString& d, ng_wp_data_t* wp_data, gbfile* f)
-{
-  char z[50];
-
-  memset(z, 0, 50);
-  int i = strlen(STRFROMUNICODE(s));
-  gbfputc(i, f);
-  gbfwrite(STRFROMUNICODE(s), 1, i, f);
-
-  gbfwrite(&wp_data->pad1[0], 8, 1, f);
-  gbfputint32(wp_data->East, f);
-  gbfputint32(wp_data->North, f);
-  gbfwrite(&wp_data->pad2[0], 2, 1, f);
-  gbfputint32(wp_data->Alt, f);
-
-  i = strlen(STRFROMUNICODE(d));
-  gbfputc(i, f);
-  gbfwrite(STRFROMUNICODE(d), 1, i, f);
-  gbfwrite(z, 44, 1, f);
-}
-
-static void
-ng_fwrite_next_wp(ng_next_wp_t* nwp, gbfile* f)
-{
-  gbfwrite(nwp->pad1, 2, 1, f);
-  gbfputint16(nwp->next_wp, f);
-  gbfwrite(nwp->pad2, 2, 1, f);
-}
-
-static void
-ng_fread_wp_data(char* d, ng_wp_no_comment_t* wpnc, gbfile* f)
-{
-  gbfread(&wpnc->chHeaderLen ,sizeof(wpnc->chHeaderLen), 1, f);
-  gbfread(&wpnc->strName, wpnc->chHeaderLen, 1, f);
-  wpnc->strName[wpnc->chHeaderLen] = 0;
-
-
-  gbfread(&wpnc->wp_data, 8, 1, f);
-  wpnc->wp_data.East = gbfgetint32(f);
-  wpnc->wp_data.North = gbfgetint32(f);
-  gbfread(&wpnc->wp_data.pad2,2, 1, f);
-  wpnc->wp_data.Alt = gbfgetint32(f);
-  gbfread(&wpnc->wp_data.CommentLength, 1, 1, f);
-  int i = (int)wpnc->wp_data.CommentLength;
-
-
-  /* Read the comment field */
-  gbfread(d, i + 44, 1, f);
-
-}
-
-static void
-ng_fread_next_wp(ng_next_wp_t* nwp, gbfile* f)
-{
-  gbfread(&nwp->pad1, 2, 1, f);
-  nwp->next_wp = gbfgetint16(f);
-  gbfread(&nwp->pad2, 2, 1, f);
-}
-
-/* =================== Write data functions ====================================*/
-
-static void
-ng_fill_header_default()
-{
-  ng_file_header_t default_header = {
-    0x00,
-    {0xff, 0xff, 0x01, 0x00, 0x09, 0x00},
-    {'C', 'W', 'a', 'y', 'P', 'o', 'i', 'n', 't'},
-    {0x01, 0x00, 0x00, 0x00},
-  };
-
-  ng_file_header =default_header;
-
-}
-
-
-static void
-ng_fill_waypoint_default()
-{
-  ng_wp_data_t default_wp  = {
-    {0xfe, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00},
-    0,
-    0,
-    {0x01, 0x01},
-    0,
-    0x00,
-
-  };
-
-  ng_next_wp_t default_ng_next_wp = {
-    {0x01, 0x80},
-    0,
-    {0x00, 0x00},
-  };
-
-  WPNC.wp_data = default_wp;
-  ng_next_wp = default_ng_next_wp;
-}
-
-
-static void
-ng_waypt_rd(const Waypoint* wpt)
-{
-  char z[50];
-  double lat, lon;
-  static int current_wp_ix=0;
-
-  memset(z, 0, 50);
-  current_wp_ix++;
-  ng_fill_waypoint_default();
-
-  if (!GPS_Math_WGS84_To_ICS_EN(wpt->latitude, wpt->longitude, &lon, &lat)) {
-    fatal(MYNAME ": Waypoint %d is out of the israeli grid area", current_wp_ix);
-  }
-
-  WPNC.wp_data.North = (int32_t)lat;
-  WPNC.wp_data.East = (int32_t)lon;
-
-  QString s;
-  if (reorder_wp) {
-    sprintf(temp_short_name, "A%03d", current_wp_ix);
-    s = temp_short_name;
-  }
-
-  else {
-    s = wpt->shortname;
-  }
-
-  ng_fwrite_wp_data(s, wpt->description, &WPNC.wp_data, file_out);
-
-
-  /* if not Last WP, write the next one index */
-
-  if (nof_wp > current_wp_ix) {
-    ng_next_wp.next_wp = current_wp_ix + 1;
-
-    ng_fwrite_next_wp(&ng_next_wp, file_out);
-
-  }
-}
-
-static void
-header_write()
-{
-  ng_file_header.nof_wp = nof_wp;
-  gbfputint16(nof_wp, file_out);
-  gbfwrite(&ng_file_header.pad1[0], 19, 1, file_out);
-
-}
-
-
-static void
-data_write()
-{
-  nof_wp = waypt_count();
-  if (nof_wp) {
-    header_write();
-    waypt_disp_all(ng_waypt_rd);
-  } else {
-    nof_wp = route_waypt_count();
-    if (nof_wp) {
-      header_write();
-      route_disp_all(nullptr, nullptr, ng_waypt_rd);
-    }
-  }
-}
-
-
-static void
-wr_init(const QString& fname)
-{
-  file_out = gbfopen_le(fname, "wb", MYNAME);
-  ng_fill_header_default();
-  if (nullptr != reorder)
-    if (!case_ignore_strcmp(reorder, "y")) {
-      reorder_wp = 1;
-    }
-
-}
-
-static void
-wr_deinit()
-{
-  gbfclose(file_out);
-}
-
-/*=========================== Read data functions ==================================*/
-
-static void
-rd_init(const QString& fname)
-{
-  file_in = gbfopen_le(fname, "rb", MYNAME);
-
-  ng_read_file_header();
-
-  if (nullptr != process) {
-    if (!case_ignore_strcmp(process, "wp")) {
-      process_rte = 0;
-    }
-    if (!case_ignore_strcmp(process, "rte")) {
-      process_rte = 1;
-    }
-  }
-
-
-}
-
-static void
-rd_deinit()
-{
-  gbfclose(file_in);
-  file_in = nullptr;
-}
-
-
-
-static void
-ng_read_file_header()
-{
-
-  nof_wp = gbfgetint16(file_in);
-  gbfread(&ng_file_header.pad1[0], 19, 1, file_in);
-  ng_file_header.nof_wp = nof_wp;
-
-
-  if (strncmp("CWayPoint", ng_file_header.signature, 9)) {
-    fatal("\nInvalid Naviguide file format\n");
-  }
-
-
-}
-
-static void
-data_read()
-{
-  if (process_rte) {
-    rte_head = new route_head;
-    route_add_head(rte_head);
-  }
-
-  for (int n = 0; n < nof_wp; ++n) {
-
-    auto* wpt_tmp = new Waypoint;
-
-    /* Read waypoint data */
-
-    ng_fread_wp_data(strComment, &WPNC, file_in);
-
-
-    if (n < nof_wp - 1) {
-      /*
-       gbfread (&ng_next_wp.pad1[0], 2, 1, file_in);
-       ng_next_wp.next_wp = gbfgetint16 (file_in);
-       gbfread (&ng_next_wp.pad2[0], 2, 1, file_in);
-       */
-      ng_fread_next_wp(&ng_next_wp, file_in);
-
-    }
-    /* Clear commas form the comment for CSV file commonality */
-    for (unsigned i = 0; i <strlen(strComment); ++i) {
-      if (strComment[i] == ',') {
-        strComment[i] = ' ';
-      }
-    }
-
-    /* put the data in the waypoint structure */
-    ng_convert_datum(wpt_tmp);
-    wpt_tmp->shortname = STRTOUNICODE(WPNC.strName);
-    wpt_tmp->description = STRTOUNICODE(strComment);
-
-    if (process_rte) {
-      route_add_wpt(rte_head, wpt_tmp);
-    } else {
-      waypt_add(wpt_tmp);
-    }
-  }
-} /* data_read */
-
-
-
-ff_vecs_t ng_vecs = {
-  ff_type_file,
-  FF_CAP_RW_WPT,
-  rd_init,
-  wr_init,
-  rd_deinit,
-  wr_deinit,
-  data_read,
-  data_write,
-  nullptr,
-  &ng_args,
-  CET_CHARSET_HEBREW, 0
-  , NULL_POS_OPS,
-  nullptr
-};
diff --git a/netstumbler.cc b/netstumbler.cc
deleted file mode 100644 (file)
index 53d724e..0000000
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
-    Read Netstumbler data files.
-
-    Copyright (C) 2004-2020 Robert Lipe, robertlipe+source@gpsbabel.org and
-    John Temples; gpsns@xargs.com
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
- */
-
-#include <QtCore/QDate>      // for QDate
-#include <QtCore/QDateTime>  // for QDateTime
-#include <QtCore/QString>    // for QString
-#include <QtCore/QTime>      // for QTime
-#include <QtCore/QVector>    // for QVector
-#include <QtCore/Qt>         // for UTC
-#include <cctype>            // for isspace
-#include <cstdio>            // for snprintf
-#include <cstdlib>           // for atof, atoi, qsort, strtol
-#include <cstring>           // for strcpy, strlen, strncmp, strstr
-#include "cet_util.h"        // for cet_convert_init
-#include "csv_util.h"        // for csv_lineparse
-#include "defs.h"            // for arglist_t, Waypoint, ff_cap, WaypointList, ff_cap_none, ddmm2degrees, ARG_NOMINMAX, ARGTYPE_STRING, ff_cap_read, get_crc32, lrtrim, waypt_add, xfree, xmalloc, ff_type_file, ARGTYPE_BOOL, CET_CHARSET_ASCII, CET_CHARSET_UTF8, CSTR, NULL_POS_OPS, ff_vecs_t
-#include "gbfile.h"          // for gbfclose, gbfgetstr, gbfopen, gbfile
-
-static gbfile* file_in;
-static char* nseicon = nullptr;
-static char* nsneicon = nullptr;
-static char* seicon = nullptr;
-static char* sneicon = nullptr;
-static char* snmac = nullptr;
-static int macstumbler;
-
-static void    fix_netstumbler_dupes(const WaypointList*);
-
-#define MYNAME "NETSTUMBLER"
-
-static
-QVector<arglist_t> netstumbler_args = {
-  {
-    "nseicon", &nseicon, "Non-stealth encrypted icon name",
-    "Red Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "nsneicon", &nsneicon, "Non-stealth non-encrypted icon name",
-    "Green Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "seicon", &seicon, "Stealth encrypted icon name",
-    "Red Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "sneicon", &sneicon, "Stealth non-encrypted icon name",
-    "Green Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
-  },
-  {
-    "snmac", &snmac, "Shortname is MAC address", nullptr, ARGTYPE_BOOL,
-    ARG_NOMINMAX, nullptr
-  },
-};
-
-static void
-rd_init(const QString& fname)
-{
-  file_in = gbfopen(fname, "rb", MYNAME);
-  macstumbler = 0;
-}
-
-static void
-rd_deinit()
-{
-  gbfclose(file_in);
-}
-
-static void
-data_read()
-{
-  char* ibuf;
-  char ssid[2 + 32 + 2 + 1];                   /* "( " + SSID + " )" + null */
-  char mac[2 + 17 + 2 + 1];                    /* "( " + MAC + " )" + null */
-  QString desc;
-  double lat = 0, lon = 0;
-  int line_no = 0;
-  int stealth_num = 0, whitespace_num = 0;
-  long flags = 0;
-  int speed = 0, channel = 0;
-  int line = 0;
-  WaypointList tmp_waypt_list;
-  QDate date;
-  QTime time;
-
-  while ((ibuf = gbfgetstr(file_in))) {
-    int len;
-    int stealth = 0;
-
-
-    if ((line++ == 0) && file_in->unicode) {
-      cet_convert_init(CET_CHARSET_UTF8, 1);
-    }
-    ibuf = lrtrim(ibuf);
-    /* A sharp in column zero might be a comment.  Or it might be
-     * something useful, like the date.
-    */
-
-    if (ibuf[0] == '#') {
-      if (strncmp(&ibuf[2], "$DateGMT:", 9) == 0) {
-        date = QDate::fromString(ibuf + 12, "yyyy-MM-dd");
-      }
-
-      /*
-       * Mac stumbler files are the same, except
-       * use DDMM.mmm instead of DD.DDDD.
-       */
-      if (strstr(ibuf, "Creator: MacStumbler")) {
-        macstumbler = 1;
-      }
-
-      continue;
-    }
-
-    int field_num = 0;
-    line_no++;
-    char* field = csv_lineparse(ibuf, "\t", "", line_no);
-
-    while (field) {
-      switch (field_num) {
-      case 0:                          /* lat */
-        lat = atof(&field[2]);
-        if (field[0] == 'S') {
-          lat = -lat;
-        }
-        if (macstumbler) {
-          lat = ddmm2degrees(lat);
-        }
-        break;
-
-      case 1:                          /* long */
-        lon = atof(&field[2]);
-        if (field[0] == 'W') {
-          lon = -lon;
-        }
-        if (macstumbler) {
-          lon = ddmm2degrees(lon);
-        }
-        break;
-
-      case 2:                          /* ( SSID ) */
-        strcpy(ssid, &field[2]); /* zap "( " */
-        len = strlen(ssid) - 2;
-        ssid[len] = 0;          /* zap " )" */
-        stealth = (len == 0);
-        /* don't alter SSID in snmac mode */
-        if (!snmac) {
-          int found = 0;
-          /* check for all whitespace */
-          for (int i = 0; i < len && !found; i++) {
-            if (!isspace(ssid[i])) {
-              found = 1;
-            }
-          }
-
-          if (!stealth && !found) {
-            snprintf(ssid, sizeof ssid, "Whitespace/%d", ++whitespace_num);
-          }
-        }
-        break;
-
-      case 4:                  /* ( MAC address ) */
-        strcpy(mac, &field[2]);        /* zap "( " */
-        mac[strlen(mac) - 2] = 0;/* zap " )" */
-        break;
-
-      case 5:                  /* time */
-        time = QTime::fromString(field, "hh:mm:ss");
-        break;
-
-      case 8:                                  /* flags */
-        flags = strtol(field, nullptr, 16);
-        break;
-
-      case 11:                         /* data rate */
-        speed = atoi(field) / 10;
-        break;
-
-      case 12:                         /* last channel */
-        channel = atoi(field);
-        break;
-
-      case 3:                  /* type */
-      case 6:                  /* SNR/sig/noise */
-      case 7:                  /* name */
-      case 9:                  /* channel bits */
-      case 10:         /* beacon interval */
-      default:
-        break;
-      }
-
-      field_num++;
-      field = csv_lineparse(nullptr, "\t", "", line_no);
-    }
-
-    if (lat == 0 && lon == 0) {        /* skip records with no GPS data */
-      continue;
-    }
-
-    auto* wpt_tmp = new Waypoint;
-
-    if (stealth) {
-      if (!snmac) {
-        snprintf(ssid, sizeof ssid, "Stealth/%d", ++stealth_num);
-      }
-
-      if (flags & 0x0010) {    /* encrypted? */
-        wpt_tmp->icon_descr = seicon;
-      } else {
-        wpt_tmp->icon_descr = sneicon;
-      }
-    } else {
-      if (flags & 0x0010) {    /* encrypted? */
-        wpt_tmp->icon_descr = nseicon;
-      } else {
-        wpt_tmp->icon_descr = nsneicon;
-      }
-    }
-
-    if (snmac) {
-      desc = QString("%1/%2 Mbps/Ch %3").arg(ssid).arg(speed).arg(channel);
-      wpt_tmp->shortname = (mac);
-    } else {
-      desc = QString("%1 Mbps/Ch %2/%3").arg(speed).arg(channel).arg(mac);
-      wpt_tmp->shortname = (ssid);
-    }
-
-    wpt_tmp->description = desc;
-    wpt_tmp->longitude = lon;
-    wpt_tmp->latitude = lat;
-    wpt_tmp->SetCreationTime(QDateTime(date, time, Qt::UTC));
-
-    tmp_waypt_list.waypt_add(wpt_tmp);
-  }
-
-  fix_netstumbler_dupes(&tmp_waypt_list);
-
-  for (Waypoint* wpt : tmp_waypt_list) {
-    waypt_add(wpt);
-  }
-}
-
-struct htable_t {
-  unsigned long crc;
-  Waypoint* wpt;
-};
-
-static
-int
-compare(const void* a, const void* b)
-{
-  unsigned long crc_a = ((const htable_t*)a)->crc;
-  unsigned long crc_b = ((const htable_t*)b)->crc;
-
-  /* we can't just return crc_a - crc_b because the return type is
-   * signed.
-   * */
-
-  if (crc_a < crc_b) {
-    return -1;
-  } else if (crc_a > crc_b) {
-    return 1;
-  } else {
-    /* CRCs are equal; we need to subsort on the description (which
-     * includes the MAC address) to guarantee the same ordering of
-     * the output for any qsort() implementation.  this is strictly
-     * to make the testo script happy.
-     * */
-
-    Waypoint* wpt_a = ((const htable_t*)a)->wpt;
-    Waypoint* wpt_b = ((const htable_t*)b)->wpt;
-    return wpt_a->description.compare(wpt_b->description);
-  }
-}
-
-/* netstumbler data will have a lot of duplicate shortnames if the SSID
- * is used as the shortname (the default).  salvage the dupes by
- * synthesizing a (hopefully) unique shortname.
- * */
-
-static
-void
-fix_netstumbler_dupes(const WaypointList* waypt_list)
-{
-  int ct = waypt_list->count(), serial = 0;
-  unsigned long last_crc;
-
-  auto* htable = (htable_t*) xmalloc(ct * sizeof(htable_t));
-  htable_t* bh = htable;
-
-  int i = 0;
-  for (Waypoint* waypointp : *waypt_list) {
-    bh->wpt = waypointp;
-    QString snptr = bh->wpt->shortname;
-    QString tmp_sn = snptr.toLower();
-    bh->crc = get_crc32(CSTR(tmp_sn), tmp_sn.length());
-    i ++;
-    bh ++;
-  }
-
-  qsort(htable, ct, sizeof *htable, compare);
-
-  last_crc = htable[0].crc + 1;                /* force mismatch */
-
-  for (i = 0, bh = htable; i < ct; i++, bh++) {
-    if (last_crc == bh->crc) {
-      bh->wpt->shortname += QString("/%1").arg(++serial);
-    } else {
-      last_crc = bh->crc;
-    }
-  }
-
-  xfree(htable);
-}
-
-ff_vecs_t netstumbler_vecs = {
-  ff_type_file,
-  { ff_cap_read, ff_cap_none, ff_cap_none },
-  rd_init,
-  nullptr,
-  rd_deinit,
-  nullptr,
-  data_read,
-  nullptr,
-  nullptr,
-  &netstumbler_args,
-  CET_CHARSET_ASCII, 0 /* CET-REVIEW */
-  , NULL_POS_OPS,
-  nullptr
-};
diff --git a/reference/alantrl.gpx b/reference/alantrl.gpx
deleted file mode 100644 (file)
index e4519fc..0000000
+++ /dev/null
@@ -1,2443 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
-  <time>1970-01-01T00:00:00Z</time>
-  <bounds minlat="28.649722222" minlon="-17.973583333" maxlat="28.706111111" maxlon="-17.926500000"/>
-  <trk>
-    <name>FH-DRIVE</name>
-    <trkseg>
-      <trkpt lat="28.697833333" lon="-17.949000000">
-        <ele>-4542.400</ele>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>654.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.949000000">
-        <ele>656.000</ele>
-        <speed>0.527778</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.949000000">
-        <ele>657.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697805556" lon="-17.948972222">
-        <ele>658.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697805556" lon="-17.949000000">
-        <ele>658.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>661.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>659.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.949000000">
-        <ele>660.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>656.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>657.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.949000000">
-        <ele>656.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>655.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>658.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>657.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>656.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>659.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697805556" lon="-17.949000000">
-        <ele>658.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697805556" lon="-17.949000000">
-        <ele>660.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697805556" lon="-17.949000000">
-        <ele>661.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.949000000">
-        <ele>660.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.949000000">
-        <ele>657.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>656.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>657.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.948972222">
-        <ele>656.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697805556" lon="-17.949000000">
-        <ele>656.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697805556" lon="-17.948972222">
-        <ele>658.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697805556" lon="-17.949000000">
-        <ele>657.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697833333" lon="-17.949027778">
-        <ele>661.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697805556" lon="-17.949138889">
-        <ele>659.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697750000" lon="-17.949333333">
-        <ele>654.800</ele>
-        <speed>2.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697750000" lon="-17.949555556">
-        <ele>650.200</ele>
-        <speed>2.388889</speed>
-      </trkpt>
-      <trkpt lat="28.697638889" lon="-17.949527778">
-        <ele>645.800</ele>
-        <speed>1.888889</speed>
-      </trkpt>
-      <trkpt lat="28.697444444" lon="-17.949305556">
-        <ele>642.600</ele>
-        <speed>2.861111</speed>
-      </trkpt>
-      <trkpt lat="28.697138889" lon="-17.949138889">
-        <ele>645.000</ele>
-        <speed>3.194444</speed>
-      </trkpt>
-      <trkpt lat="28.696805556" lon="-17.948972222">
-        <ele>647.400</ele>
-        <speed>4.083333</speed>
-      </trkpt>
-      <trkpt lat="28.696527778" lon="-17.949027778">
-        <ele>647.800</ele>
-        <speed>3.805556</speed>
-      </trkpt>
-      <trkpt lat="28.696277778" lon="-17.949222222">
-        <ele>646.600</ele>
-        <speed>2.833333</speed>
-      </trkpt>
-      <trkpt lat="28.696333333" lon="-17.949444444">
-        <ele>642.200</ele>
-        <speed>3.055556</speed>
-      </trkpt>
-      <trkpt lat="28.696611111" lon="-17.949500000">
-        <ele>637.800</ele>
-        <speed>2.722222</speed>
-      </trkpt>
-      <trkpt lat="28.696805556" lon="-17.949638889">
-        <ele>631.000</ele>
-        <speed>2.944444</speed>
-      </trkpt>
-      <trkpt lat="28.696750000" lon="-17.950000000">
-        <ele>625.000</ele>
-        <speed>2.666667</speed>
-      </trkpt>
-      <trkpt lat="28.696750000" lon="-17.950194444">
-        <ele>621.800</ele>
-        <speed>3.333333</speed>
-      </trkpt>
-      <trkpt lat="28.696750000" lon="-17.950194444">
-        <ele>618.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.696750000" lon="-17.950194444">
-        <ele>615.600</ele>
-        <speed>0.888889</speed>
-      </trkpt>
-    </trkseg>
-  </trk>
-  <trk>
-    <name>30-12-05</name>
-    <desc>PIRATENBUCH</desc>
-    <number>1</number>
-    <trkseg>
-      <trkpt lat="28.697861111" lon="-17.949583333">
-        <ele>-4542.400</ele>
-      </trkpt>
-      <trkpt lat="28.697944444" lon="-17.949555556">
-        <ele>653.000</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.698027778" lon="-17.949555556">
-        <ele>651.000</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.698083333" lon="-17.949527778">
-        <ele>654.200</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.698111111" lon="-17.949527778">
-        <ele>650.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698111111" lon="-17.949527778">
-        <ele>648.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698138889" lon="-17.949527778">
-        <ele>651.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698250000" lon="-17.949555556">
-        <ele>649.800</ele>
-        <speed>0.861111</speed>
-      </trkpt>
-      <trkpt lat="28.698333333" lon="-17.949638889">
-        <ele>644.400</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.698416667" lon="-17.949694444">
-        <ele>645.000</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.698500000" lon="-17.949694444">
-        <ele>647.000</ele>
-        <speed>0.972222</speed>
-      </trkpt>
-      <trkpt lat="28.698611111" lon="-17.949666667">
-        <ele>645.600</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.698694444" lon="-17.949694444">
-        <ele>643.400</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.698777778" lon="-17.949722222">
-        <ele>639.800</ele>
-        <speed>0.861111</speed>
-      </trkpt>
-      <trkpt lat="28.698861111" lon="-17.949750000">
-        <ele>639.600</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.698861111" lon="-17.949777778">
-        <ele>640.400</ele>
-        <speed>0.666667</speed>
-      </trkpt>
-      <trkpt lat="28.698888889" lon="-17.949805556">
-        <ele>647.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698944444" lon="-17.949777778">
-        <ele>649.400</ele>
-        <speed>0.722222</speed>
-      </trkpt>
-      <trkpt lat="28.699027778" lon="-17.949722222">
-        <ele>648.800</ele>
-        <speed>1.722222</speed>
-      </trkpt>
-      <trkpt lat="28.699083333" lon="-17.949666667">
-        <ele>646.200</ele>
-        <speed>0.722222</speed>
-      </trkpt>
-      <trkpt lat="28.699083333" lon="-17.949694444">
-        <ele>642.800</ele>
-        <speed>0.555556</speed>
-      </trkpt>
-      <trkpt lat="28.699111111" lon="-17.949666667">
-        <ele>639.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699166667" lon="-17.949611111">
-        <ele>635.400</ele>
-        <speed>0.777778</speed>
-      </trkpt>
-      <trkpt lat="28.699194444" lon="-17.949527778">
-        <ele>631.400</ele>
-        <speed>0.972222</speed>
-      </trkpt>
-      <trkpt lat="28.699250000" lon="-17.949416667">
-        <ele>625.400</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.699277778" lon="-17.949361111">
-        <ele>623.600</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.699277778" lon="-17.949361111">
-        <ele>624.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699305556" lon="-17.949361111">
-        <ele>624.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699277778" lon="-17.949361111">
-        <ele>625.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699333333" lon="-17.949305556">
-        <ele>625.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699333333" lon="-17.949361111">
-        <ele>623.800</ele>
-        <speed>0.694444</speed>
-      </trkpt>
-      <trkpt lat="28.699305556" lon="-17.949500000">
-        <ele>626.000</ele>
-        <speed>1.027778</speed>
-      </trkpt>
-      <trkpt lat="28.699361111" lon="-17.949638889">
-        <ele>625.800</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.699416667" lon="-17.949750000">
-        <ele>629.000</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.699416667" lon="-17.949777778">
-        <ele>628.200</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.699444444" lon="-17.949916667">
-        <ele>626.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699444444" lon="-17.949972222">
-        <ele>625.800</ele>
-        <speed>0.777778</speed>
-      </trkpt>
-      <trkpt lat="28.699500000" lon="-17.950027778">
-        <ele>624.800</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.699555556" lon="-17.950138889">
-        <ele>622.600</ele>
-        <speed>0.555556</speed>
-      </trkpt>
-      <trkpt lat="28.699583333" lon="-17.950166667">
-        <ele>621.400</ele>
-        <speed>0.694444</speed>
-      </trkpt>
-      <trkpt lat="28.699666667" lon="-17.950222222">
-        <ele>623.200</ele>
-        <speed>0.666667</speed>
-      </trkpt>
-      <trkpt lat="28.699722222" lon="-17.950250000">
-        <ele>623.000</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.699833333" lon="-17.950250000">
-        <ele>621.200</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.699916667" lon="-17.950277778">
-        <ele>619.400</ele>
-        <speed>0.944444</speed>
-      </trkpt>
-      <trkpt lat="28.699972222" lon="-17.950250000">
-        <ele>621.000</ele>
-        <speed>0.694444</speed>
-      </trkpt>
-      <trkpt lat="28.699944444" lon="-17.950277778">
-        <ele>621.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699972222" lon="-17.950444444">
-        <ele>622.200</ele>
-        <speed>1.583333</speed>
-      </trkpt>
-      <trkpt lat="28.700027778" lon="-17.950527778">
-        <ele>622.200</ele>
-        <speed>1.583333</speed>
-      </trkpt>
-      <trkpt lat="28.700111111" lon="-17.950444444">
-        <ele>625.400</ele>
-        <speed>0.722222</speed>
-      </trkpt>
-      <trkpt lat="28.700138889" lon="-17.950388889">
-        <ele>618.400</ele>
-        <speed>0.638889</speed>
-      </trkpt>
-      <trkpt lat="28.700222222" lon="-17.950333333">
-        <ele>617.200</ele>
-        <speed>0.777778</speed>
-      </trkpt>
-      <trkpt lat="28.700305556" lon="-17.950277778">
-        <ele>615.200</ele>
-        <speed>0.888889</speed>
-      </trkpt>
-      <trkpt lat="28.700388889" lon="-17.950250000">
-        <ele>616.200</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.700444444" lon="-17.950250000">
-        <ele>616.000</ele>
-        <speed>0.777778</speed>
-      </trkpt>
-      <trkpt lat="28.700527778" lon="-17.950222222">
-        <ele>613.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700611111" lon="-17.950111111">
-        <ele>609.200</ele>
-        <speed>0.944444</speed>
-      </trkpt>
-      <trkpt lat="28.700666667" lon="-17.950083333">
-        <ele>607.600</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.700722222" lon="-17.950138889">
-        <ele>604.800</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.700750000" lon="-17.950166667">
-        <ele>606.400</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700722222" lon="-17.950250000">
-        <ele>609.600</ele>
-        <speed>0.833333</speed>
-      </trkpt>
-      <trkpt lat="28.700722222" lon="-17.950333333">
-        <ele>614.200</ele>
-        <speed>0.750000</speed>
-      </trkpt>
-      <trkpt lat="28.700666667" lon="-17.950444444">
-        <ele>618.800</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700638889" lon="-17.950527778">
-        <ele>619.400</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.700638889" lon="-17.950583333">
-        <ele>621.800</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.700611111" lon="-17.950583333">
-        <ele>623.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700583333" lon="-17.950694444">
-        <ele>625.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700583333" lon="-17.950750000">
-        <ele>629.600</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.700638889" lon="-17.950805556">
-        <ele>628.600</ele>
-        <speed>0.555556</speed>
-      </trkpt>
-      <trkpt lat="28.700666667" lon="-17.950833333">
-        <ele>624.200</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.700694444" lon="-17.950861111">
-        <ele>625.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700694444" lon="-17.950833333">
-        <ele>623.800</ele>
-        <speed>0.583333</speed>
-      </trkpt>
-      <trkpt lat="28.700694444" lon="-17.950805556">
-        <ele>607.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700722222" lon="-17.950861111">
-        <ele>597.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700722222" lon="-17.950944444">
-        <ele>613.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700777778" lon="-17.951000000">
-        <ele>621.400</ele>
-        <speed>0.777778</speed>
-      </trkpt>
-      <trkpt lat="28.700750000" lon="-17.951083333">
-        <ele>618.600</ele>
-        <speed>0.861111</speed>
-      </trkpt>
-      <trkpt lat="28.700805556" lon="-17.951166667">
-        <ele>618.200</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.700833333" lon="-17.951166667">
-        <ele>615.800</ele>
-        <speed>0.638889</speed>
-      </trkpt>
-      <trkpt lat="28.700861111" lon="-17.951194444">
-        <ele>615.600</ele>
-        <speed>0.833333</speed>
-      </trkpt>
-      <trkpt lat="28.700861111" lon="-17.951138889">
-        <ele>614.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700861111" lon="-17.951138889">
-        <ele>623.000</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.700861111" lon="-17.951138889">
-        <ele>630.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700861111" lon="-17.951111111">
-        <ele>626.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700861111" lon="-17.951111111">
-        <ele>624.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700916667" lon="-17.951111111">
-        <ele>627.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701027778" lon="-17.951138889">
-        <ele>627.000</ele>
-        <speed>1.027778</speed>
-      </trkpt>
-      <trkpt lat="28.701111111" lon="-17.951166667">
-        <ele>625.200</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.701138889" lon="-17.951166667">
-        <ele>624.400</ele>
-        <speed>0.972222</speed>
-      </trkpt>
-      <trkpt lat="28.701138889" lon="-17.951166667">
-        <ele>624.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701111111" lon="-17.951166667">
-        <ele>623.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701111111" lon="-17.951166667">
-        <ele>621.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701111111" lon="-17.951138889">
-        <ele>618.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701111111" lon="-17.951138889">
-        <ele>614.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701194444" lon="-17.951111111">
-        <ele>618.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701305556" lon="-17.951138889">
-        <ele>621.200</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.701444444" lon="-17.951222222">
-        <ele>624.000</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.701583333" lon="-17.951305556">
-        <ele>623.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701750000" lon="-17.951361111">
-        <ele>626.600</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.701916667" lon="-17.951416667">
-        <ele>627.600</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.702055556" lon="-17.951472222">
-        <ele>626.200</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.702194444" lon="-17.951527778">
-        <ele>626.000</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.702305556" lon="-17.951583333">
-        <ele>628.800</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.702416667" lon="-17.951611111">
-        <ele>629.200</ele>
-        <speed>1.222222</speed>
-      </trkpt>
-      <trkpt lat="28.702555556" lon="-17.951611111">
-        <ele>629.200</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.702638889" lon="-17.951583333">
-        <ele>628.200</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.702694444" lon="-17.951555556">
-        <ele>627.400</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.702777778" lon="-17.951472222">
-        <ele>626.600</ele>
-        <speed>0.750000</speed>
-      </trkpt>
-      <trkpt lat="28.702861111" lon="-17.951388889">
-        <ele>626.800</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.702944444" lon="-17.951277778">
-        <ele>626.600</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.703055556" lon="-17.951222222">
-        <ele>628.000</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.703166667" lon="-17.951222222">
-        <ele>629.600</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.703277778" lon="-17.951277778">
-        <ele>629.600</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.703361111" lon="-17.951388889">
-        <ele>629.400</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.703388889" lon="-17.951500000">
-        <ele>627.600</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.703416667" lon="-17.951638889">
-        <ele>627.200</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.703444444" lon="-17.951777778">
-        <ele>626.400</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.703472222" lon="-17.951916667">
-        <ele>625.600</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.703500000" lon="-17.951972222">
-        <ele>625.200</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.703500000" lon="-17.951916667">
-        <ele>621.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.703500000" lon="-17.951944444">
-        <ele>613.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.703527778" lon="-17.951972222">
-        <ele>618.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.703138889" lon="-17.952277778">
-        <ele>623.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.702888889" lon="-17.952722222">
-        <ele>619.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.702666667" lon="-17.953194444">
-        <ele>606.200</ele>
-        <speed>1.444444</speed>
-      </trkpt>
-      <trkpt lat="28.702527778" lon="-17.953694444">
-        <ele>596.000</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.702500000" lon="-17.954000000">
-        <ele>595.400</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.702166667" lon="-17.954361111">
-        <ele>596.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701861111" lon="-17.954750000">
-        <ele>591.200</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.701638889" lon="-17.955222222">
-        <ele>572.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701305556" lon="-17.955583333">
-        <ele>555.200</ele>
-        <speed>0.611111</speed>
-      </trkpt>
-      <trkpt lat="28.701000000" lon="-17.955972222">
-        <ele>550.800</ele>
-        <speed>0.861111</speed>
-      </trkpt>
-      <trkpt lat="28.700611111" lon="-17.956250000">
-        <ele>542.800</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.700222222" lon="-17.956527778">
-        <ele>545.000</ele>
-        <speed>0.777778</speed>
-      </trkpt>
-      <trkpt lat="28.699861111" lon="-17.956861111">
-        <ele>532.200</ele>
-        <speed>0.694444</speed>
-      </trkpt>
-      <trkpt lat="28.699638889" lon="-17.957305556">
-        <ele>521.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699666667" lon="-17.957833333">
-        <ele>513.600</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.699777778" lon="-17.958333333">
-        <ele>504.800</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.700111111" lon="-17.958694444">
-        <ele>503.400</ele>
-        <speed>1.555556</speed>
-      </trkpt>
-      <trkpt lat="28.700500000" lon="-17.958972222">
-        <ele>501.000</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.700777778" lon="-17.959388889">
-        <ele>501.000</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.700305556" lon="-17.959416667">
-        <ele>495.400</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.699916667" lon="-17.959694444">
-        <ele>487.000</ele>
-        <speed>1.611111</speed>
-      </trkpt>
-      <trkpt lat="28.699611111" lon="-17.960083333">
-        <ele>481.800</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.699333333" lon="-17.960500000">
-        <ele>475.200</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.698861111" lon="-17.960500000">
-        <ele>475.200</ele>
-        <speed>1.222222</speed>
-      </trkpt>
-      <trkpt lat="28.698500000" lon="-17.960805556">
-        <ele>467.800</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.698777778" lon="-17.961222222">
-        <ele>458.400</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.699222222" lon="-17.961361111">
-        <ele>457.000</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.699694444" lon="-17.961416667">
-        <ele>448.600</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.699638889" lon="-17.961944444">
-        <ele>442.800</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.699527778" lon="-17.962444444">
-        <ele>433.400</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.699527778" lon="-17.962972222">
-        <ele>429.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699333333" lon="-17.963444444">
-        <ele>424.800</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.698944444" lon="-17.963722222">
-        <ele>411.600</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.698527778" lon="-17.963944444">
-        <ele>404.000</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.698111111" lon="-17.963750000">
-        <ele>395.800</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.697694444" lon="-17.963500000">
-        <ele>390.400</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.697277778" lon="-17.963750000">
-        <ele>386.400</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.696888889" lon="-17.963472222">
-        <ele>385.400</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.696666667" lon="-17.963000000">
-        <ele>391.400</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.696555556" lon="-17.963500000">
-        <ele>377.800</ele>
-        <speed>1.527778</speed>
-      </trkpt>
-      <trkpt lat="28.696583333" lon="-17.964027778">
-        <ele>370.600</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.696833333" lon="-17.964472222">
-        <ele>371.000</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.697027778" lon="-17.964944444">
-        <ele>363.800</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.697333333" lon="-17.965333333">
-        <ele>356.200</ele>
-        <speed>1.444444</speed>
-      </trkpt>
-      <trkpt lat="28.697694444" lon="-17.965694444">
-        <ele>349.000</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.698027778" lon="-17.966055556">
-        <ele>344.800</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.698111111" lon="-17.966583333">
-        <ele>341.800</ele>
-        <speed>0.777778</speed>
-      </trkpt>
-      <trkpt lat="28.698166667" lon="-17.967111111">
-        <ele>336.000</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.698361111" lon="-17.967583333">
-        <ele>320.600</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.698500000" lon="-17.968083333">
-        <ele>310.800</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.698583333" lon="-17.968611111">
-        <ele>299.200</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.698694444" lon="-17.968666667">
-        <ele>290.400</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.698694444" lon="-17.968666667">
-        <ele>284.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698694444" lon="-17.968666667">
-        <ele>283.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698694444" lon="-17.968666667">
-        <ele>283.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698722222" lon="-17.968666667">
-        <ele>281.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698722222" lon="-17.968666667">
-        <ele>276.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698750000" lon="-17.968722222">
-        <ele>277.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698777778" lon="-17.968194444">
-        <ele>292.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699027778" lon="-17.967750000">
-        <ele>278.600</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.699138889" lon="-17.967805556">
-        <ele>270.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699194444" lon="-17.968166667">
-        <ele>252.200</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.699416667" lon="-17.967833333">
-        <ele>246.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699555556" lon="-17.967805556">
-        <ele>223.400</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.699638889" lon="-17.967972222">
-        <ele>209.200</ele>
-        <speed>0.555556</speed>
-      </trkpt>
-      <trkpt lat="28.699555556" lon="-17.968333333">
-        <ele>177.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699722222" lon="-17.968277778">
-        <ele>193.800</ele>
-        <speed>0.638889</speed>
-      </trkpt>
-      <trkpt lat="28.699777778" lon="-17.968250000">
-        <ele>181.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699805556" lon="-17.968305556">
-        <ele>175.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699805556" lon="-17.968555556">
-        <ele>179.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699916667" lon="-17.968805556">
-        <ele>168.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699916667" lon="-17.969083333">
-        <ele>155.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699861111" lon="-17.969277778">
-        <ele>124.800</ele>
-        <speed>0.694444</speed>
-      </trkpt>
-      <trkpt lat="28.699388889" lon="-17.969222222">
-        <ele>126.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699861111" lon="-17.969277778">
-        <ele>123.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700361111" lon="-17.969305556">
-        <ele>125.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699972222" lon="-17.969388889">
-        <ele>90.800</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699750000" lon="-17.969583333">
-        <ele>101.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699833333" lon="-17.969916667">
-        <ele>109.600</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.700055556" lon="-17.970027778">
-        <ele>73.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700083333" lon="-17.970388889">
-        <ele>66.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700250000" lon="-17.970194444">
-        <ele>56.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700472222" lon="-17.970194444">
-        <ele>44.800</ele>
-        <speed>0.888889</speed>
-      </trkpt>
-      <trkpt lat="28.700722222" lon="-17.970638889">
-        <ele>44.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700083333" lon="-17.971250000">
-        <ele>22.800</ele>
-        <speed>1.638889</speed>
-      </trkpt>
-      <trkpt lat="28.700555556" lon="-17.971194444">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700027778" lon="-17.971277778">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700583333" lon="-17.971333333">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701166667" lon="-17.971194444">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700722222" lon="-17.971055556">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700361111" lon="-17.971388889">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700500000" lon="-17.971416667">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700472222" lon="-17.971333333">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700583333" lon="-17.971333333">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700500000" lon="-17.971416667">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700444444" lon="-17.971361111">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700444444" lon="-17.971416667">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700555556" lon="-17.971361111">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700416667" lon="-17.971333333">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700583333" lon="-17.971305556">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700250000" lon="-17.971722222">
-        <ele>24.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700416667" lon="-17.971444444">
-        <ele>117.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700555556" lon="-17.971250000">
-        <ele>54.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700472222" lon="-17.970500000">
-        <ele>41.000</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.700527778" lon="-17.969972222">
-        <ele>45.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700638889" lon="-17.970027778">
-        <ele>40.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700666667" lon="-17.970555556">
-        <ele>45.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700944444" lon="-17.970777778">
-        <ele>43.400</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.701333333" lon="-17.970750000">
-        <ele>49.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701388889" lon="-17.970333333">
-        <ele>69.800</ele>
-        <speed>0.750000</speed>
-      </trkpt>
-      <trkpt lat="28.701611111" lon="-17.970416667">
-        <ele>101.800</ele>
-        <speed>0.694444</speed>
-      </trkpt>
-      <trkpt lat="28.701750000" lon="-17.970472222">
-        <ele>115.200</ele>
-        <speed>0.694444</speed>
-      </trkpt>
-      <trkpt lat="28.701916667" lon="-17.970111111">
-        <ele>125.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.702083333" lon="-17.970472222">
-        <ele>148.800</ele>
-        <speed>0.555556</speed>
-      </trkpt>
-      <trkpt lat="28.702250000" lon="-17.970666667">
-        <ele>164.800</ele>
-        <speed>0.722222</speed>
-      </trkpt>
-      <trkpt lat="28.702277778" lon="-17.970805556">
-        <ele>177.000</ele>
-        <speed>0.888889</speed>
-      </trkpt>
-      <trkpt lat="28.702000000" lon="-17.971222222">
-        <ele>173.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.702444444" lon="-17.971305556">
-        <ele>166.200</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.702861111" lon="-17.971500000">
-        <ele>144.400</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.702388889" lon="-17.971555556">
-        <ele>130.000</ele>
-        <speed>1.222222</speed>
-      </trkpt>
-      <trkpt lat="28.702583333" lon="-17.972055556">
-        <ele>131.600</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.703027778" lon="-17.972194444">
-        <ele>112.600</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.703055556" lon="-17.972444444">
-        <ele>101.200</ele>
-        <speed>0.638889</speed>
-      </trkpt>
-      <trkpt lat="28.702750000" lon="-17.972833333">
-        <ele>90.200</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.702750000" lon="-17.973361111">
-        <ele>72.600</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.702666667" lon="-17.973583333">
-        <ele>59.400</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.703027778" lon="-17.973583333">
-        <ele>41.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.703277778" lon="-17.973138889">
-        <ele>14.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.703694444" lon="-17.972861111">
-        <ele>8.800</ele>
-        <speed>2.305556</speed>
-      </trkpt>
-    </trkseg>
-  </trk>
-  <trk>
-    <name>1-1-06</name>
-    <desc>TORRE TIME</desc>
-    <number>2</number>
-    <trkseg>
-      <trkpt lat="28.697944444" lon="-17.949222222">
-        <ele>-4542.400</ele>
-      </trkpt>
-      <trkpt lat="28.697916667" lon="-17.949250000">
-        <ele>653.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697944444" lon="-17.949250000">
-        <ele>657.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697944444" lon="-17.949222222">
-        <ele>654.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.697750000" lon="-17.949500000">
-        <ele>653.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698194444" lon="-17.949638889">
-        <ele>647.400</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.698638889" lon="-17.949750000">
-        <ele>646.400</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.699111111" lon="-17.949750000">
-        <ele>643.400</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.699361111" lon="-17.949277778">
-        <ele>636.800</ele>
-        <speed>0.833333</speed>
-      </trkpt>
-      <trkpt lat="28.699444444" lon="-17.949805556">
-        <ele>621.800</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.699722222" lon="-17.950222222">
-        <ele>619.800</ele>
-        <speed>1.444444</speed>
-      </trkpt>
-      <trkpt lat="28.700138889" lon="-17.950416667">
-        <ele>618.800</ele>
-        <speed>0.638889</speed>
-      </trkpt>
-      <trkpt lat="28.700527778" lon="-17.950138889">
-        <ele>618.600</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.700611111" lon="-17.950666667">
-        <ele>615.200</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.700805556" lon="-17.951138889">
-        <ele>615.000</ele>
-        <speed>0.722222</speed>
-      </trkpt>
-      <trkpt lat="28.701277778" lon="-17.951111111">
-        <ele>624.000</ele>
-        <speed>0.611111</speed>
-      </trkpt>
-      <trkpt lat="28.701027778" lon="-17.950694444">
-        <ele>623.400</ele>
-        <speed>0.861111</speed>
-      </trkpt>
-      <trkpt lat="28.701250000" lon="-17.950222222">
-        <ele>640.000</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.701472222" lon="-17.949750000">
-        <ele>644.400</ele>
-        <speed>0.944444</speed>
-      </trkpt>
-      <trkpt lat="28.701472222" lon="-17.949722222">
-        <ele>652.000</ele>
-        <speed>0.833333</speed>
-      </trkpt>
-      <trkpt lat="28.701527778" lon="-17.949611111">
-        <ele>656.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701555556" lon="-17.949083333">
-        <ele>655.400</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.702027778" lon="-17.949027778">
-        <ele>665.200</ele>
-        <speed>0.888889</speed>
-      </trkpt>
-      <trkpt lat="28.701805556" lon="-17.948555556">
-        <ele>677.800</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.702055556" lon="-17.948111111">
-        <ele>684.400</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.702305556" lon="-17.947638889">
-        <ele>692.200</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.702388889" lon="-17.947111111">
-        <ele>696.200</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.702583333" lon="-17.946611111">
-        <ele>701.600</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.702777778" lon="-17.946138889">
-        <ele>712.400</ele>
-        <speed>1.027778</speed>
-      </trkpt>
-      <trkpt lat="28.703055556" lon="-17.945722222">
-        <ele>717.400</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.702583333" lon="-17.945666667">
-        <ele>718.400</ele>
-        <speed>1.444444</speed>
-      </trkpt>
-      <trkpt lat="28.702166667" lon="-17.945861111">
-        <ele>725.800</ele>
-        <speed>0.694444</speed>
-      </trkpt>
-      <trkpt lat="28.702000000" lon="-17.945750000">
-        <ele>752.000</ele>
-        <speed>0.527778</speed>
-      </trkpt>
-      <trkpt lat="28.702472222" lon="-17.945722222">
-        <ele>745.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.702916667" lon="-17.945583333">
-        <ele>735.000</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.702805556" lon="-17.946083333">
-        <ele>727.600</ele>
-        <speed>1.222222</speed>
-      </trkpt>
-      <trkpt lat="28.702666667" lon="-17.946583333">
-        <ele>726.400</ele>
-        <speed>1.444444</speed>
-      </trkpt>
-      <trkpt lat="28.702972222" lon="-17.946194444">
-        <ele>710.600</ele>
-        <speed>0.500000</speed>
-      </trkpt>
-      <trkpt lat="28.703250000" lon="-17.945777778">
-        <ele>727.400</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.703277778" lon="-17.945805556">
-        <ele>738.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.703277778" lon="-17.945777778">
-        <ele>735.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.703500000" lon="-17.945305556">
-        <ele>738.800</ele>
-        <speed>1.027778</speed>
-      </trkpt>
-      <trkpt lat="28.703694444" lon="-17.944833333">
-        <ele>748.200</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.703944444" lon="-17.944388889">
-        <ele>754.800</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.704027778" lon="-17.943861111">
-        <ele>767.000</ele>
-        <speed>0.972222</speed>
-      </trkpt>
-      <trkpt lat="28.704444444" lon="-17.943638889">
-        <ele>774.000</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.704750000" lon="-17.943722222">
-        <ele>780.600</ele>
-        <speed>0.694444</speed>
-      </trkpt>
-      <trkpt lat="28.705111111" lon="-17.943583333">
-        <ele>802.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.705416667" lon="-17.943194444">
-        <ele>802.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.705694444" lon="-17.942777778">
-        <ele>814.200</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.706111111" lon="-17.942527778">
-        <ele>817.400</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.705916667" lon="-17.942027778">
-        <ele>826.600</ele>
-        <speed>0.833333</speed>
-      </trkpt>
-      <trkpt lat="28.705472222" lon="-17.942111111">
-        <ele>835.000</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.705111111" lon="-17.942472222">
-        <ele>841.400</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.705055556" lon="-17.941944444">
-        <ele>846.200</ele>
-        <speed>2.250000</speed>
-      </trkpt>
-      <trkpt lat="28.704972222" lon="-17.941416667">
-        <ele>855.600</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.704972222" lon="-17.940888889">
-        <ele>857.600</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.704916667" lon="-17.940361111">
-        <ele>862.800</ele>
-        <speed>1.222222</speed>
-      </trkpt>
-      <trkpt lat="28.704916667" lon="-17.939833333">
-        <ele>871.000</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.705055556" lon="-17.939333333">
-        <ele>883.800</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.705111111" lon="-17.938805556">
-        <ele>890.400</ele>
-        <speed>0.722222</speed>
-      </trkpt>
-      <trkpt lat="28.705222222" lon="-17.938277778">
-        <ele>902.800</ele>
-        <speed>0.944444</speed>
-      </trkpt>
-      <trkpt lat="28.705277778" lon="-17.937750000">
-        <ele>906.600</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.705333333" lon="-17.937222222">
-        <ele>918.600</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.705527778" lon="-17.936750000">
-        <ele>928.200</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.705444444" lon="-17.936222222">
-        <ele>942.800</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.705500000" lon="-17.935694444">
-        <ele>947.800</ele>
-        <speed>0.972222</speed>
-      </trkpt>
-      <trkpt lat="28.705527778" lon="-17.935166667">
-        <ele>955.200</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.705666667" lon="-17.934666667">
-        <ele>970.800</ele>
-        <speed>0.916667</speed>
-      </trkpt>
-      <trkpt lat="28.705694444" lon="-17.934138889">
-        <ele>981.800</ele>
-        <speed>0.861111</speed>
-      </trkpt>
-      <trkpt lat="28.705722222" lon="-17.933611111">
-        <ele>988.800</ele>
-        <speed>0.944444</speed>
-      </trkpt>
-      <trkpt lat="28.705694444" lon="-17.933083333">
-        <ele>1001.400</ele>
-        <speed>1.527778</speed>
-      </trkpt>
-      <trkpt lat="28.705444444" lon="-17.932638889">
-        <ele>1009.600</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.705277778" lon="-17.932555556">
-        <ele>1013.200</ele>
-        <speed>1.944444</speed>
-      </trkpt>
-      <trkpt lat="28.705027778" lon="-17.932111111">
-        <ele>1017.200</ele>
-        <speed>0.638889</speed>
-      </trkpt>
-      <trkpt lat="28.704583333" lon="-17.931944444">
-        <ele>1010.600</ele>
-        <speed>1.027778</speed>
-      </trkpt>
-      <trkpt lat="28.704527778" lon="-17.932472222">
-        <ele>1006.000</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.704111111" lon="-17.932666667">
-        <ele>1006.000</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.703805556" lon="-17.933055556">
-        <ele>1009.200</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.703388889" lon="-17.933250000">
-        <ele>1002.400</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.703027778" lon="-17.933555556">
-        <ele>996.200</ele>
-        <speed>0.583333</speed>
-      </trkpt>
-      <trkpt lat="28.702777778" lon="-17.933111111">
-        <ele>992.000</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.702583333" lon="-17.932611111">
-        <ele>978.400</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.702166667" lon="-17.932861111">
-        <ele>974.800</ele>
-        <speed>1.666667</speed>
-      </trkpt>
-      <trkpt lat="28.701861111" lon="-17.933250000">
-        <ele>974.800</ele>
-        <speed>0.944444</speed>
-      </trkpt>
-      <trkpt lat="28.701416667" lon="-17.933361111">
-        <ele>974.400</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.700944444" lon="-17.933388889">
-        <ele>971.000</ele>
-        <speed>1.527778</speed>
-      </trkpt>
-      <trkpt lat="28.700833333" lon="-17.933305556">
-        <ele>969.400</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.700833333" lon="-17.933305556">
-        <ele>966.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700833333" lon="-17.933333333">
-        <ele>971.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700722222" lon="-17.933166667">
-        <ele>967.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700638889" lon="-17.932638889">
-        <ele>964.800</ele>
-        <speed>0.666667</speed>
-      </trkpt>
-      <trkpt lat="28.700666667" lon="-17.931805556">
-        <ele>952.800</ele>
-        <speed>1.222222</speed>
-      </trkpt>
-      <trkpt lat="28.700555556" lon="-17.932861111">
-        <ele>1045.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700416667" lon="-17.933916667">
-        <ele>952.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700527778" lon="-17.933222222">
-        <ele>829.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700805556" lon="-17.932250000">
-        <ele>892.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700611111" lon="-17.933000000">
-        <ele>1031.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700500000" lon="-17.933555556">
-        <ele>938.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700611111" lon="-17.932833333">
-        <ele>868.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700805556" lon="-17.931888889">
-        <ele>955.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700638889" lon="-17.932722222">
-        <ele>1050.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700833333" lon="-17.931972222">
-        <ele>948.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700722222" lon="-17.932694444">
-        <ele>1025.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701416667" lon="-17.932055556">
-        <ele>957.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700805556" lon="-17.932583333">
-        <ele>952.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700388889" lon="-17.932333333">
-        <ele>942.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699972222" lon="-17.932111111">
-        <ele>943.800</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.698750000" lon="-17.932194444">
-        <ele>938.800</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.698388889" lon="-17.931861111">
-        <ele>939.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698194444" lon="-17.932333333">
-        <ele>945.000</ele>
-        <speed>1.805556</speed>
-      </trkpt>
-      <trkpt lat="28.697861111" lon="-17.932694444">
-        <ele>950.000</ele>
-        <speed>0.777778</speed>
-      </trkpt>
-      <trkpt lat="28.697388889" lon="-17.932666667">
-        <ele>961.200</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.696916667" lon="-17.932666667">
-        <ele>968.800</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.696638889" lon="-17.932250000">
-        <ele>971.200</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.696444444" lon="-17.931777778">
-        <ele>967.400</ele>
-        <speed>0.972222</speed>
-      </trkpt>
-      <trkpt lat="28.696138889" lon="-17.931388889">
-        <ele>966.600</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.696111111" lon="-17.930861111">
-        <ele>961.400</ele>
-        <speed>0.722222</speed>
-      </trkpt>
-      <trkpt lat="28.696055556" lon="-17.930333333">
-        <ele>968.800</ele>
-        <speed>0.750000</speed>
-      </trkpt>
-      <trkpt lat="28.695277778" lon="-17.931305556">
-        <ele>968.000</ele>
-        <speed>0.638889</speed>
-      </trkpt>
-      <trkpt lat="28.696388889" lon="-17.931111111">
-        <ele>967.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.694972222" lon="-17.930861111">
-        <ele>967.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.694861111" lon="-17.930361111">
-        <ele>937.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.694694444" lon="-17.929861111">
-        <ele>1009.200</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.694166667" lon="-17.930305556">
-        <ele>1010.000</ele>
-        <speed>0.888889</speed>
-      </trkpt>
-      <trkpt lat="28.693694444" lon="-17.930277778">
-        <ele>1009.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.693805556" lon="-17.929777778">
-        <ele>996.800</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.693444444" lon="-17.929444444">
-        <ele>1000.600</ele>
-        <speed>1.444444</speed>
-      </trkpt>
-      <trkpt lat="28.693555556" lon="-17.928944444">
-        <ele>1013.000</ele>
-        <speed>1.555556</speed>
-      </trkpt>
-      <trkpt lat="28.693500000" lon="-17.928416667">
-        <ele>1013.400</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.692805556" lon="-17.928000000">
-        <ele>1018.200</ele>
-        <speed>0.555556</speed>
-      </trkpt>
-      <trkpt lat="28.692750000" lon="-17.927472222">
-        <ele>1017.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.692305556" lon="-17.927638889">
-        <ele>1029.000</ele>
-        <speed>0.888889</speed>
-      </trkpt>
-      <trkpt lat="28.692250000" lon="-17.928166667">
-        <ele>1028.600</ele>
-        <speed>0.638889</speed>
-      </trkpt>
-      <trkpt lat="28.691805556" lon="-17.928333333">
-        <ele>1028.600</ele>
-        <speed>1.722222</speed>
-      </trkpt>
-      <trkpt lat="28.691444444" lon="-17.928638889">
-        <ele>1034.400</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.691305556" lon="-17.928138889">
-        <ele>1034.400</ele>
-        <speed>1.583333</speed>
-      </trkpt>
-      <trkpt lat="28.690861111" lon="-17.928250000">
-        <ele>1034.200</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.690527778" lon="-17.927888889">
-        <ele>1037.000</ele>
-        <speed>1.583333</speed>
-      </trkpt>
-      <trkpt lat="28.690055556" lon="-17.927916667">
-        <ele>1032.000</ele>
-        <speed>1.527778</speed>
-      </trkpt>
-      <trkpt lat="28.689638889" lon="-17.927694444">
-        <ele>1024.800</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.689277778" lon="-17.927333333">
-        <ele>1025.000</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.688833333" lon="-17.927194444">
-        <ele>1022.600</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.688916667" lon="-17.926916667">
-        <ele>1023.000</ele>
-        <speed>1.222222</speed>
-      </trkpt>
-      <trkpt lat="28.689277778" lon="-17.926611111">
-        <ele>1039.800</ele>
-        <speed>0.833333</speed>
-      </trkpt>
-      <trkpt lat="28.689361111" lon="-17.926527778">
-        <ele>1056.600</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.689388889" lon="-17.926500000">
-        <ele>1061.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.689333333" lon="-17.926527778">
-        <ele>1065.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.689361111" lon="-17.926527778">
-        <ele>1056.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.689333333" lon="-17.926527778">
-        <ele>1060.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.689361111" lon="-17.926527778">
-        <ele>1057.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.689194444" lon="-17.926638889">
-        <ele>1058.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.688861111" lon="-17.926944444">
-        <ele>1047.800</ele>
-        <speed>0.666667</speed>
-      </trkpt>
-      <trkpt lat="28.688888889" lon="-17.927277778">
-        <ele>1045.200</ele>
-        <speed>0.527778</speed>
-      </trkpt>
-      <trkpt lat="28.689333333" lon="-17.927361111">
-        <ele>1049.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.689694444" lon="-17.927666667">
-        <ele>1030.600</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.690111111" lon="-17.927916667">
-        <ele>1027.600</ele>
-        <speed>1.638889</speed>
-      </trkpt>
-      <trkpt lat="28.690583333" lon="-17.927944444">
-        <ele>1033.800</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.690888889" lon="-17.928333333">
-        <ele>1035.600</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.691305556" lon="-17.928111111">
-        <ele>1030.400</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.691722222" lon="-17.928305556">
-        <ele>1029.600</ele>
-        <speed>0.861111</speed>
-      </trkpt>
-      <trkpt lat="28.692166667" lon="-17.928444444">
-        <ele>1029.400</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.692222222" lon="-17.927888889">
-        <ele>1029.600</ele>
-        <speed>1.222222</speed>
-      </trkpt>
-      <trkpt lat="28.692583333" lon="-17.927555556">
-        <ele>1030.200</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.692888889" lon="-17.927972222">
-        <ele>1024.200</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.693222222" lon="-17.928333333">
-        <ele>1016.600</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.693611111" lon="-17.928611111">
-        <ele>1016.600</ele>
-        <speed>1.555556</speed>
-      </trkpt>
-      <trkpt lat="28.693500000" lon="-17.929111111">
-        <ele>1016.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.693777778" lon="-17.929527778">
-        <ele>1020.800</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.693722222" lon="-17.930055556">
-        <ele>1019.400</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.693972222" lon="-17.930527778">
-        <ele>1019.400</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.693444444" lon="-17.930444444">
-        <ele>1018.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.694222222" lon="-17.930388889">
-        <ele>1018.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.694583333" lon="-17.930055556">
-        <ele>1018.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.694861111" lon="-17.930472222">
-        <ele>1000.200</ele>
-        <speed>1.527778</speed>
-      </trkpt>
-      <trkpt lat="28.695250000" lon="-17.930750000">
-        <ele>1004.000</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.695416667" lon="-17.931250000">
-        <ele>1005.600</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.695777778" lon="-17.930944444">
-        <ele>1004.800</ele>
-        <speed>0.805556</speed>
-      </trkpt>
-      <trkpt lat="28.695972222" lon="-17.930444444">
-        <ele>987.400</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.696361111" lon="-17.930722222">
-        <ele>977.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.696250000" lon="-17.931555556">
-        <ele>977.600</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.696611111" lon="-17.931888889">
-        <ele>962.400</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.696722222" lon="-17.932388889">
-        <ele>962.600</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.697027778" lon="-17.932777778">
-        <ele>962.600</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.697500000" lon="-17.932833333">
-        <ele>966.800</ele>
-        <speed>1.555556</speed>
-      </trkpt>
-      <trkpt lat="28.697944444" lon="-17.932750000">
-        <ele>968.600</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.698277778" lon="-17.932388889">
-        <ele>962.200</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.698472222" lon="-17.932055556">
-        <ele>954.400</ele>
-        <speed>0.666667</speed>
-      </trkpt>
-      <trkpt lat="28.698722222" lon="-17.932222222">
-        <ele>941.200</ele>
-        <speed>0.944444</speed>
-      </trkpt>
-      <trkpt lat="28.699111111" lon="-17.931944444">
-        <ele>946.000</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.699555556" lon="-17.931861111">
-        <ele>933.800</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.700000000" lon="-17.932055556">
-        <ele>933.600</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.700333333" lon="-17.932416667">
-        <ele>937.600</ele>
-        <speed>1.638889</speed>
-      </trkpt>
-      <trkpt lat="28.700888889" lon="-17.932416667">
-        <ele>930.800</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.700777778" lon="-17.932666667">
-        <ele>933.200</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700750000" lon="-17.932722222">
-        <ele>937.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700555556" lon="-17.933194444">
-        <ele>943.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700805556" lon="-17.933277778">
-        <ele>928.800</ele>
-        <speed>0.611111</speed>
-      </trkpt>
-      <trkpt lat="28.700916667" lon="-17.933361111">
-        <ele>944.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700888889" lon="-17.933333333">
-        <ele>959.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700805556" lon="-17.933361111">
-        <ele>957.000</ele>
-        <speed>0.638889</speed>
-      </trkpt>
-      <trkpt lat="28.701222222" lon="-17.933583333">
-        <ele>963.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.701666667" lon="-17.933416667">
-        <ele>967.800</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.702083333" lon="-17.933222222">
-        <ele>961.400</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.702388889" lon="-17.932833333">
-        <ele>960.800</ele>
-        <speed>1.527778</speed>
-      </trkpt>
-      <trkpt lat="28.702805556" lon="-17.933083333">
-        <ele>964.000</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.702944444" lon="-17.933583333">
-        <ele>964.800</ele>
-        <speed>0.944444</speed>
-      </trkpt>
-      <trkpt lat="28.703194444" lon="-17.934027778">
-        <ele>967.800</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.703472222" lon="-17.934444444">
-        <ele>975.400</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.703833333" lon="-17.934138889">
-        <ele>971.000</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.703833333" lon="-17.934750000">
-        <ele>961.800</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.704027778" lon="-17.935222222">
-        <ele>958.400</ele>
-        <speed>1.666667</speed>
-      </trkpt>
-      <trkpt lat="28.704111111" lon="-17.935750000">
-        <ele>952.800</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-      <trkpt lat="28.704361111" lon="-17.936194444">
-        <ele>945.400</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.704777778" lon="-17.936388889">
-        <ele>940.800</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.704472222" lon="-17.936861111">
-        <ele>938.800</ele>
-        <speed>1.555556</speed>
-      </trkpt>
-      <trkpt lat="28.704000000" lon="-17.936861111">
-        <ele>911.000</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.703833333" lon="-17.936361111">
-        <ele>918.800</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.703583333" lon="-17.936805556">
-        <ele>920.400</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.703305556" lon="-17.937222222">
-        <ele>914.800</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.702861111" lon="-17.937361111">
-        <ele>911.200</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.702500000" lon="-17.937694444">
-        <ele>900.200</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.702111111" lon="-17.937972222">
-        <ele>896.000</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.701638889" lon="-17.937972222">
-        <ele>891.600</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.701194444" lon="-17.937861111">
-        <ele>884.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700888889" lon="-17.937472222">
-        <ele>882.200</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.701000000" lon="-17.936972222">
-        <ele>883.000</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.700666667" lon="-17.936611111">
-        <ele>879.600</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.700194444" lon="-17.936694444">
-        <ele>880.000</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.699722222" lon="-17.936694444">
-        <ele>883.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699444444" lon="-17.937111111">
-        <ele>885.200</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.699000000" lon="-17.937194444">
-        <ele>870.200</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.698555556" lon="-17.937027778">
-        <ele>860.400</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.698138889" lon="-17.937277778">
-        <ele>863.200</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.698583333" lon="-17.937388889">
-        <ele>856.400</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.698777778" lon="-17.937861111">
-        <ele>843.400</ele>
-        <speed>1.555556</speed>
-      </trkpt>
-      <trkpt lat="28.698944444" lon="-17.938361111">
-        <ele>839.000</ele>
-        <speed>1.527778</speed>
-      </trkpt>
-      <trkpt lat="28.699388889" lon="-17.938277778">
-        <ele>833.200</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.699750000" lon="-17.937944444">
-        <ele>828.600</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.699805556" lon="-17.938472222">
-        <ele>828.600</ele>
-        <speed>1.611111</speed>
-      </trkpt>
-      <trkpt lat="28.699888889" lon="-17.939000000">
-        <ele>827.400</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.700000000" lon="-17.939500000">
-        <ele>820.600</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.700138889" lon="-17.940000000">
-        <ele>806.600</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.700111111" lon="-17.940527778">
-        <ele>810.800</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.699972222" lon="-17.941027778">
-        <ele>806.200</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.699916667" lon="-17.941555556">
-        <ele>805.000</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.700138889" lon="-17.942055556">
-        <ele>802.200</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.700583333" lon="-17.942138889">
-        <ele>797.200</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.700833333" lon="-17.942583333">
-        <ele>793.600</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.700916667" lon="-17.943111111">
-        <ele>785.800</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.700750000" lon="-17.943611111">
-        <ele>777.400</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.700472222" lon="-17.944027778">
-        <ele>778.000</ele>
-        <speed>1.305556</speed>
-      </trkpt>
-      <trkpt lat="28.700361111" lon="-17.944527778">
-        <ele>776.200</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.700333333" lon="-17.945055556">
-        <ele>780.200</ele>
-        <speed>1.666667</speed>
-      </trkpt>
-      <trkpt lat="28.700444444" lon="-17.945555556">
-        <ele>785.400</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.700861111" lon="-17.945750000">
-        <ele>782.200</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.701305556" lon="-17.945638889">
-        <ele>773.600</ele>
-        <speed>1.444444</speed>
-      </trkpt>
-      <trkpt lat="28.701555556" lon="-17.945194444">
-        <ele>772.000</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.701888889" lon="-17.945555556">
-        <ele>777.800</ele>
-        <speed>1.472222</speed>
-      </trkpt>
-      <trkpt lat="28.702250000" lon="-17.945861111">
-        <ele>759.600</ele>
-        <speed>1.444444</speed>
-      </trkpt>
-      <trkpt lat="28.702666667" lon="-17.945666667">
-        <ele>753.600</ele>
-        <speed>1.388889</speed>
-      </trkpt>
-      <trkpt lat="28.702750000" lon="-17.946194444">
-        <ele>754.800</ele>
-        <speed>1.444444</speed>
-      </trkpt>
-      <trkpt lat="28.702527778" lon="-17.946666667">
-        <ele>742.600</ele>
-        <speed>1.555556</speed>
-      </trkpt>
-      <trkpt lat="28.702333333" lon="-17.947138889">
-        <ele>735.800</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.702250000" lon="-17.947666667">
-        <ele>727.000</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.702000000" lon="-17.948111111">
-        <ele>722.600</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.701750000" lon="-17.948555556">
-        <ele>719.400</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.702083333" lon="-17.948916667">
-        <ele>710.400</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.701611111" lon="-17.948972222">
-        <ele>688.800</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.701500000" lon="-17.949472222">
-        <ele>677.400</ele>
-        <speed>1.166667</speed>
-      </trkpt>
-      <trkpt lat="28.701361111" lon="-17.949972222">
-        <ele>671.600</ele>
-        <speed>0.861111</speed>
-      </trkpt>
-      <trkpt lat="28.701111111" lon="-17.950416667">
-        <ele>664.200</ele>
-        <speed>1.027778</speed>
-      </trkpt>
-      <trkpt lat="28.701138889" lon="-17.950944444">
-        <ele>655.200</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.700777778" lon="-17.950944444">
-        <ele>648.600</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.700583333" lon="-17.950472222">
-        <ele>622.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.700138889" lon="-17.950305556">
-        <ele>615.600</ele>
-        <speed>1.055556</speed>
-      </trkpt>
-      <trkpt lat="28.699750000" lon="-17.950027778">
-        <ele>620.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.699416667" lon="-17.949666667">
-        <ele>618.000</ele>
-        <speed>1.555556</speed>
-      </trkpt>
-      <trkpt lat="28.698972222" lon="-17.949777778">
-        <ele>620.800</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.698500000" lon="-17.949722222">
-        <ele>624.400</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.698055556" lon="-17.949555556">
-        <ele>626.200</ele>
-        <speed>0.972222</speed>
-      </trkpt>
-      <trkpt lat="28.697861111" lon="-17.949083333">
-        <ele>634.400</ele>
-        <speed>1.000000</speed>
-      </trkpt>
-    </trkseg>
-  </trk>
-  <trk>
-    <name>2-1-06</name>
-    <desc>TAZACORTE</desc>
-    <number>3</number>
-    <trkseg>
-      <trkpt lat="28.663388889" lon="-17.942472222">
-        <ele>-4542.400</ele>
-      </trkpt>
-      <trkpt lat="28.663444444" lon="-17.942444444">
-        <ele>518.600</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.663444444" lon="-17.942444444">
-        <ele>525.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.663805556" lon="-17.942500000">
-        <ele>530.400</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.663527778" lon="-17.942916667">
-        <ele>530.800</ele>
-        <speed>1.111111</speed>
-      </trkpt>
-      <trkpt lat="28.663055556" lon="-17.942916667">
-        <ele>507.000</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.662583333" lon="-17.942916667">
-        <ele>509.200</ele>
-        <speed>1.361111</speed>
-      </trkpt>
-      <trkpt lat="28.662138889" lon="-17.943027778">
-        <ele>507.800</ele>
-        <speed>2.638889</speed>
-      </trkpt>
-      <trkpt lat="28.661694444" lon="-17.943194444">
-        <ele>495.200</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.661250000" lon="-17.943333333">
-        <ele>492.200</ele>
-        <speed>1.333333</speed>
-      </trkpt>
-      <trkpt lat="28.660805556" lon="-17.943472222">
-        <ele>486.200</ele>
-        <speed>1.194444</speed>
-      </trkpt>
-      <trkpt lat="28.660361111" lon="-17.943583333">
-        <ele>478.800</ele>
-        <speed>1.638889</speed>
-      </trkpt>
-      <trkpt lat="28.659888889" lon="-17.943555556">
-        <ele>464.400</ele>
-        <speed>0.944444</speed>
-      </trkpt>
-      <trkpt lat="28.659638889" lon="-17.943500000">
-        <ele>454.200</ele>
-        <speed>1.027778</speed>
-      </trkpt>
-      <trkpt lat="28.659250000" lon="-17.943777778">
-        <ele>457.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.658861111" lon="-17.944055556">
-        <ele>432.400</ele>
-        <speed>0.777778</speed>
-      </trkpt>
-      <trkpt lat="28.658472222" lon="-17.944333333">
-        <ele>415.000</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-      <trkpt lat="28.658333333" lon="-17.944833333">
-        <ele>406.000</ele>
-        <speed>1.250000</speed>
-      </trkpt>
-      <trkpt lat="28.658777778" lon="-17.945000000">
-        <ele>392.600</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.658916667" lon="-17.945500000">
-        <ele>390.200</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.658555556" lon="-17.945833333">
-        <ele>377.000</ele>
-        <speed>1.277778</speed>
-      </trkpt>
-      <trkpt lat="28.658194444" lon="-17.946194444">
-        <ele>368.800</ele>
-        <speed>1.138889</speed>
-      </trkpt>
-      <trkpt lat="28.657916667" lon="-17.946611111">
-        <ele>351.400</ele>
-        <speed>1.416667</speed>
-      </trkpt>
-      <trkpt lat="28.657611111" lon="-17.947000000">
-        <ele>341.000</ele>
-        <speed>1.222222</speed>
-      </trkpt>
-      <trkpt lat="28.657194444" lon="-17.947194444">
-        <ele>331.400</ele>
-        <speed>1.083333</speed>
-      </trkpt>
-      <trkpt lat="28.652027778" lon="-17.946500000">
-        <ele>328.000</ele>
-        <speed>1.500000</speed>
-      </trkpt>
-      <trkpt lat="28.649722222" lon="-17.946305556">
-        <ele>327.800</ele>
-        <speed>0.000000</speed>
-      </trkpt>
-    </trkseg>
-  </trk>
-</gpx>
diff --git a/reference/alantrl.trl b/reference/alantrl.trl
deleted file mode 100644 (file)
index c0f94ab..0000000
Binary files a/reference/alantrl.trl and /dev/null differ
diff --git a/reference/alanwpr.gpx b/reference/alanwpr.gpx
deleted file mode 100644 (file)
index 52852e0..0000000
+++ /dev/null
@@ -1,376 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
-  <time>1970-01-01T00:00:00Z</time>
-  <bounds minlat="28.455250000" minlon="-17.980111111" maxlat="47.650694444" maxlon="9.483111111"/>
-  <wpt lat="47.650694444" lon="9.483111111">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Home</name>
-    <cmt>Sweet_Home</cmt>
-    <desc>Sweet_Home</desc>
-  </wpt>
-  <wpt lat="28.620472222" lon="-17.752805556">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Airport</name>
-    <cmt>Santa_Cruz</cmt>
-    <desc>Santa_Cruz</desc>
-  </wpt>
-  <wpt lat="28.830361111" lon="-17.803222222">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GAS001</name>
-    <cmt>Barlovento</cmt>
-    <desc>Barlovento</desc>
-  </wpt>
-  <wpt lat="28.763444444" lon="-17.977722222">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GAS002</name>
-    <cmt>Puntagorda</cmt>
-    <desc>Puntagorda</desc>
-  </wpt>
-  <wpt lat="28.766000000" lon="-17.980111111">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Police</name>
-    <cmt>Puntagorda</cmt>
-    <desc>Puntagorda</desc>
-  </wpt>
-  <wpt lat="28.689583333" lon="-17.767472222">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>SMrkt01</name>
-    <cmt>Santa_Cruz</cmt>
-    <desc>Santa_Cruz</desc>
-  </wpt>
-  <wpt lat="28.651083333" lon="-17.881027778">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>SMrkt02</name>
-    <cmt>El_Paso</cmt>
-    <desc>El_Paso</desc>
-  </wpt>
-  <wpt lat="28.778305556" lon="-17.906250000">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>PARK01</name>
-    <cmt>SmallParking</cmt>
-    <desc>SmallParking</desc>
-  </wpt>
-  <wpt lat="28.791527778" lon="-17.799361111">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>PARK02</name>
-    <cmt>Tilos_Trail</cmt>
-    <desc>Tilos_Trail</desc>
-  </wpt>
-  <wpt lat="28.780388889" lon="-17.962944444">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>PARK03</name>
-    <cmt>Las_Tricia</cmt>
-    <desc>Las_Tricia</desc>
-  </wpt>
-  <wpt lat="28.811111111" lon="-17.805222222">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Barloven</name>
-    <cmt>Barlovento</cmt>
-    <desc>Barlovento</desc>
-  </wpt>
-  <wpt lat="28.692500000" lon="-17.876888889">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Bejenado</name>
-    <cmt>Bejenado</cmt>
-    <desc>Bejenado</desc>
-  </wpt>
-  <wpt lat="28.697916667" lon="-17.856750000">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Cumbreci</name>
-    <cmt>Cumbrecita</cmt>
-    <desc>Cumbrecita</desc>
-  </wpt>
-  <wpt lat="28.578805556" lon="-17.838083333">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Durazner</name>
-    <cmt>Duraznero</cmt>
-    <desc>Duraznero</desc>
-  </wpt>
-  <wpt lat="28.614916667" lon="-17.836777778">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>El_Pilar</name>
-    <cmt>El_Pilar</cmt>
-    <desc>El_Pilar</desc>
-  </wpt>
-  <wpt lat="28.689138889" lon="-17.870083333">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>El_Rodeo</name>
-    <cmt>El_Rodeo</cmt>
-    <desc>El_Rodeo</desc>
-  </wpt>
-  <wpt lat="28.455361111" lon="-17.843166667">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>FaroFuen</name>
-    <cmt>Fuencaliente</cmt>
-    <desc>Fuencaliente</desc>
-  </wpt>
-  <wpt lat="28.730166667" lon="-17.813666667">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>F.Olen</name>
-    <cmt>Fuente_Olen</cmt>
-    <desc>Fuente_Olen</desc>
-  </wpt>
-  <wpt lat="28.583250000" lon="-17.837527778">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>HoyoNegr</name>
-    <cmt>Hoyo_Negro</cmt>
-    <desc>Hoyo_Negro</desc>
-  </wpt>
-  <wpt lat="28.754305556" lon="-17.884805556">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Muchacho</name>
-    <cmt>Rq.Muchachos</cmt>
-    <desc>Rq.Muchachos</desc>
-  </wpt>
-  <wpt lat="28.609750000" lon="-17.839944444">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>M.Birigo</name>
-    <cmt>M_Birigoyo</cmt>
-    <desc>M_Birigoyo</desc>
-  </wpt>
-  <wpt lat="28.629027778" lon="-17.802027778">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>S.Isidro</name>
-    <cmt>San_Isidro</cmt>
-    <desc>San_Isidro</desc>
-  </wpt>
-  <wpt lat="28.688250000" lon="-17.761611111">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>S.Maria</name>
-    <cmt>Santa_Maria</cmt>
-    <desc>Santa_Maria</desc>
-  </wpt>
-  <wpt lat="28.647277778" lon="-17.944055556">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Tazacort</name>
-    <cmt>Tazacorte</cmt>
-    <desc>Tazacorte</desc>
-  </wpt>
-  <wpt lat="28.692805556" lon="-17.924444444">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>T.d.Time</name>
-    <cmt>Tor_del_Time</cmt>
-    <desc>Tor_del_Time</desc>
-  </wpt>
-  <wpt lat="28.802388889" lon="-17.906944444">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Zarza</name>
-    <cmt>La_Zarza</cmt>
-    <desc>La_Zarza</desc>
-  </wpt>
-  <wpt lat="28.801638889" lon="-17.908722222">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>Zarzita</name>
-    <cmt>La_Zarzita</cmt>
-    <desc>La_Zarzita</desc>
-  </wpt>
-  <wpt lat="28.723027778" lon="-17.875583333">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>SRVCENTR</name>
-    <cmt>Servicecentr</cmt>
-    <desc>Servicecentr</desc>
-  </wpt>
-  <wpt lat="28.501916667" lon="-17.843888889">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TGR130</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.688777778" lon="-17.927250000">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TGR131</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.622972222" lon="-17.844805556">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TPRLP14</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.562611111" lon="-17.836833333">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TPRLP15</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.587416667" lon="-17.837694444">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TPRLP16</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.619361111" lon="-17.858638889">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TSLEP103</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.603194444" lon="-17.846388889">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TSLEP107</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.601944444" lon="-17.880944444">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TSLEP107</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.525138889" lon="-17.837555556">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TSLFU110</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.536055556" lon="-17.842666667">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TSLFU111</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.767166667" lon="-17.832916667">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TSLSAS30</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.703972222" lon="-17.925750000">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TSLTJ71</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.702138889" lon="-17.951472222">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>TSLTJ71a</name>
-    <cmt>Trailhead</cmt>
-    <desc>Trailhead</desc>
-  </wpt>
-  <wpt lat="28.561555556" lon="-17.836500000">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GC7CF</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.518166667" lon="-17.834250000">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCN1TQ</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.603000000" lon="-17.877250000">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCNXY8</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.622666667" lon="-17.848777778">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCHT8C</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.480750000" lon="-17.856500000">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCNQXK</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.653916667" lon="-17.852722222">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCD098</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.455250000" lon="-17.843555556">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCM6N0</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.668027778" lon="-17.831361111">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GC405B</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.651138889" lon="-17.946194444">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCD096</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.692055556" lon="-17.875194444">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCNXKV</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.703805556" lon="-17.845555556">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCNXMD</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.710027778" lon="-17.954611111">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GCHND9</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.766861111" lon="-17.833194444">
-    <time>2005-12-27T16:09:39Z</time>
-    <name>GC405C</name>
-    <cmt>Geocache</cmt>
-    <desc>Geocache</desc>
-  </wpt>
-  <wpt lat="28.698000000" lon="-17.949055556">
-    <time>2005-12-29T10:41:43Z</time>
-    <name>FH-HAUS</name>
-  </wpt>
-  <wpt lat="28.696750000" lon="-17.950194444">
-    <time>2005-12-29T11:01:17Z</time>
-    <name>FH-DRIVE</name>
-  </wpt>
-  <wpt lat="28.710055556" lon="-17.954638889">
-    <time>2005-12-31T10:31:52Z</time>
-    <name>GCHND9-1</name>
-  </wpt>
-  <wpt lat="28.710944444" lon="-17.955277778">
-    <time>2005-12-31T10:31:52Z</time>
-    <name>GCHND9-2</name>
-  </wpt>
-  <wpt lat="28.707222222" lon="-17.950888889">
-    <time>2005-12-31T10:31:52Z</time>
-    <name>GCHND9-3</name>
-  </wpt>
-  <wpt lat="28.722111111" lon="-17.979694444">
-    <time>2006-01-03T13:46:38Z</time>
-    <name>PL VETA</name>
-    <cmt>PLAYA VETA</cmt>
-    <desc>PLAYA VETA</desc>
-  </wpt>
-  <rte>
-    <name>GCHND9</name>
-    <rtept lat="28.710027778" lon="-17.954611111">
-      <time>2005-12-27T16:09:39Z</time>
-      <name>GCHND9</name>
-      <cmt>Geocache</cmt>
-      <desc>Geocache</desc>
-    </rtept>
-    <rtept lat="28.710055556" lon="-17.954638889">
-      <time>2005-12-31T10:31:52Z</time>
-      <name>GCHND9-1</name>
-    </rtept>
-    <rtept lat="28.710944444" lon="-17.955277778">
-      <time>2005-12-31T10:31:52Z</time>
-      <name>GCHND9-2</name>
-    </rtept>
-    <rtept lat="28.707222222" lon="-17.950888889">
-      <time>2005-12-31T10:31:52Z</time>
-      <name>GCHND9-3</name>
-    </rtept>
-  </rte>
-</gpx>
diff --git a/reference/alanwpr.wpr b/reference/alanwpr.wpr
deleted file mode 100644 (file)
index ecada54..0000000
Binary files a/reference/alanwpr.wpr and /dev/null differ
diff --git a/reference/an1-an1.ref b/reference/an1-an1.ref
deleted file mode 100644 (file)
index 27ccc13..0000000
Binary files a/reference/an1-an1.ref and /dev/null differ
diff --git a/reference/an1-in.ref b/reference/an1-in.ref
deleted file mode 100644 (file)
index a374b99..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-41.11111, -85.16351, 
-41.11048, -85.16341, 
-41.10986, -85.16348, 
-41.10908, -85.16357, 
-41.11138, -85.16216, 
-41.11058, -85.16223, 
-41.10990, -85.16239, 
-41.10923, -85.16255, 
-41.11138, -85.16130, 
-41.11068, -85.16127, 
-41.11000, -85.16139, 
-41.10920, -85.16155, 
-41.11142, -85.16002, 
-41.11075, -85.16030, 
-41.11005, -85.16050, 
-41.10964, -85.16062, 
-41.10824, -85.16373, 
-41.10821, -85.16300, 
-41.10817, -85.16216, 
-41.10846, -85.16123, 
-41.10768, -85.16409, 
-41.10756, -85.16300, 
-41.10768, -85.16210, 
-41.10778, -85.16123, 
-41.10684, -85.16383, 
-41.10681, -85.16287, 
diff --git a/reference/an1-line-out.ref b/reference/an1-line-out.ref
deleted file mode 100644 (file)
index 9518280..0000000
Binary files a/reference/an1-line-out.ref and /dev/null differ
diff --git a/reference/an1-out.ref b/reference/an1-out.ref
deleted file mode 100644 (file)
index fb40144..0000000
Binary files a/reference/an1-out.ref and /dev/null differ
diff --git a/reference/foo.an1 b/reference/foo.an1
deleted file mode 100644 (file)
index ae27a48..0000000
Binary files a/reference/foo.an1 and /dev/null differ
index 36d574256ecfa3e5b8a4e009f0a3900b5cc20cb6..4f0856f03e2622076eba1cb4a56ec4cf816bc84f 100644 (file)
@@ -1,5 +1,3 @@
-alantrl        trl     Alan Map500 tracklogs (.trl)
-alanwpr        wpr     Alan Map500 waypoints and routes (.wpr)
 baroiq         Brauniger IQ Series Barograph Download
 bushnell_trl   trl     Bushnell GPS Trail file
 bushnell       wpt     Bushnell GPS Waypoint file
@@ -10,7 +8,6 @@ csv            Comma separated values
 compegps               CompeGPS data files (.wpt/.trk/.rte)
 iblue747       csv     Data Logger iBlue747 csv
 iblue757       csv     Data Logger iBlue757 csv
-an1    an1     DeLorme .an1 (drawing) file
 gpl    gpl     DeLorme GPL
 saplus         DeLorme Street Atlas Plus
 saroute        anr     DeLorme Street Atlas Route
@@ -112,10 +109,8 @@ navigonwpt         Navigon Waypoints
 navilink               NaviGPS GT-11/BGT-11 Download
 sbp    sbp     NaviGPS GT-31/BGT-31 datalogger (.sbp)
 sbn    sbn     NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)
-naviguide      twl     Naviguide binary route file (.twl)
 navitel_trk    bin     Navitel binary track (.bin)
 dna    dna     Navitrak DNA marker format
-netstumbler            NetStumbler Summary File (text)
 nima           NIMA/GNIS Geographic Names File
 nmea           NMEA 0183 sentences
 lmx            Nokia Landmark Exchange
index bf7abce7e787e1241af590f2929cc1368f6766b3..daf0f072a29f800359c66702382be5230fb11799 100644 (file)
@@ -1,6 +1,4 @@
 internal       xcsv            ? Character Separated Values
-file   alantrl trl     Alan Map500 tracklogs (.trl)
-file   alanwpr wpr     Alan Map500 waypoints and routes (.wpr)
 internal       tabsep          All database fields on one tab-separated line
 serial baroiq          Brauniger IQ Series Barograph Download
 file   bushnell_trl    trl     Bushnell GPS Trail file
@@ -13,7 +11,6 @@ file  compegps                CompeGPS data files (.wpt/.trk/.rte)
 internal       custom          Custom "Everything" Style
 file   iblue747        csv     Data Logger iBlue747 csv
 file   iblue757        csv     Data Logger iBlue757 csv
-file   an1     an1     DeLorme .an1 (drawing) file
 file   gpl     gpl     DeLorme GPL
 file   saplus          DeLorme Street Atlas Plus
 file   saroute anr     DeLorme Street Atlas Route
@@ -118,10 +115,8 @@ file       navigonwpt              Navigon Waypoints
 serial navilink                NaviGPS GT-11/BGT-11 Download
 file   sbp     sbp     NaviGPS GT-31/BGT-31 datalogger (.sbp)
 file   sbn     sbn     NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)
-file   naviguide       twl     Naviguide binary route file (.twl)
 file   navitel_trk     bin     Navitel binary track (.bin)
 file   dna     dna     Navitrak DNA marker format
-file   netstumbler             NetStumbler Summary File (text)
 file   nima            NIMA/GNIS Geographic Names File
 file   nmea            NMEA 0183 sentences
 file   lmx             Nokia Landmark Exchange
index 440ae9bd4019a343aea279f02bf504247c19ddc2..0aec10336b36416442833036d406bde882aa8162 100644 (file)
@@ -1,6 +1,4 @@
 internal       rw----  xcsv            ? Character Separated Values
-file   --rw--  alantrl trl     Alan Map500 tracklogs (.trl)
-file   rw--rw  alanwpr wpr     Alan Map500 waypoints and routes (.wpr)
 internal       rw----  tabsep          All database fields on one tab-separated line
 serial --r---  baroiq          Brauniger IQ Series Barograph Download
 file   --rw--  bushnell_trl    trl     Bushnell GPS Trail file
@@ -13,7 +11,6 @@ file  rwrwrw  compegps                CompeGPS data files (.wpt/.trk/.rte)
 internal       rw----  custom          Custom "Everything" Style
 file   --rw--  iblue747        csv     Data Logger iBlue747 csv
 file   --rw--  iblue757        csv     Data Logger iBlue757 csv
-file   rw-wrw  an1     an1     DeLorme .an1 (drawing) file
 file   --rw--  gpl     gpl     DeLorme GPL
 file   rw----  saplus          DeLorme Street Atlas Plus
 file   --r---  saroute anr     DeLorme Street Atlas Route
@@ -118,10 +115,8 @@ file       rw----  navigonwpt              Navigon Waypoints
 serial rwrwrw  navilink                NaviGPS GT-11/BGT-11 Download
 file   --r---  sbp     sbp     NaviGPS GT-31/BGT-31 datalogger (.sbp)
 file   --r---  sbn     sbn     NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)
-file   rw----  naviguide       twl     Naviguide binary route file (.twl)
 file   --rw--  navitel_trk     bin     Navitel binary track (.bin)
 file   rw----  dna     dna     Navitrak DNA marker format
-file   r-----  netstumbler             NetStumbler Summary File (text)
 file   rw----  nima            NIMA/GNIS Geographic Names File
 file   rwrw--  nmea            NMEA 0183 sentences
 file   rw----  lmx             Nokia Landmark Exchange
index 643a1c7a39ef77cb10485f9b4bcee71f78808d43..dd11fecc268ab97613e661ed59d4c320f398e535 100644 (file)
@@ -16,10 +16,6 @@ option       xcsv    prefer_shortnames       Use shortname instead of description    boolean                         ht
 
 option xcsv    datum   GPS datum (def. WGS 84) string                          https://www.gpsbabel.org/WEB_DOC_DIR/fmt_xcsv.html#fmt_xcsv_o_datum
 
-file   --rw--  alantrl trl     Alan Map500 tracklogs (.trl)    alantrl
-       https://www.gpsbabel.org/WEB_DOC_DIR/fmt_alantrl.html
-file   rw--rw  alanwpr wpr     Alan Map500 waypoints and routes (.wpr) alanwpr
-       https://www.gpsbabel.org/WEB_DOC_DIR/fmt_alanwpr.html
 internal       rw----  tabsep          All database fields on one tab-separated line   xcsv
        https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tabsep.html
 option tabsep  snlen   Max synthesized shortname length        integer         1               https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tabsep.html#fmt_tabsep_o_snlen
@@ -136,26 +132,6 @@ option     iblue757        prefer_shortnames       Use shortname instead of description    boolean
 
 option iblue757        datum   GPS datum (def. WGS 84) string                          https://www.gpsbabel.org/WEB_DOC_DIR/fmt_iblue757.html#fmt_iblue757_o_datum
 
-file   rw-wrw  an1     an1     DeLorme .an1 (drawing) file     an1
-       https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html
-option an1     type    Type of .an1 file       string                          https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_type
-
-option an1     road    Road type changes       string                          https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_road
-
-option an1     nogc    Do not add geocache data to description boolean                         https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_nogc
-
-option an1     nourl   Do not add URLs to description  boolean                         https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_nourl
-
-option an1     deficon Symbol to use for point data    string  Red Flag                        https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_deficon
-
-option an1     color   Color for lines or mapnotes     string  red                     https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_color
-
-option an1     zoom    Zoom level to reduce points     integer                         https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_zoom
-
-option an1     wpt_type        Waypoint type   string                          https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_wpt_type
-
-option an1     radius  Radius for circles      string                          https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_radius
-
 file   --rw--  gpl     gpl     DeLorme GPL     gpl
        https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpl.html
 file   rw----  saplus          DeLorme Street Atlas Plus       xcsv
@@ -1080,12 +1056,6 @@ file     --r---  sbp     sbp     NaviGPS GT-31/BGT-31 datalogger (.sbp)  sbp
        https://www.gpsbabel.org/WEB_DOC_DIR/fmt_sbp.html
 file   --r---  sbn     sbn     NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn) sbn
        https://www.gpsbabel.org/WEB_DOC_DIR/fmt_sbn.html
-file   rw----  naviguide       twl     Naviguide binary route file (.twl)      naviguide
-       https://www.gpsbabel.org/WEB_DOC_DIR/fmt_naviguide.html
-option naviguide       output  'wp' - Create waypoint file , 'rte' - Create route file string  rte                     https://www.gpsbabel.org/WEB_DOC_DIR/fmt_naviguide.html#fmt_naviguide_o_output
-
-option naviguide       reorder 'n' - Keep the existing wp name, 'y' - rename waypoints string  n                       https://www.gpsbabel.org/WEB_DOC_DIR/fmt_naviguide.html#fmt_naviguide_o_reorder
-
 file   --rw--  navitel_trk     bin     Navitel binary track (.bin)     navitel_trk
        https://www.gpsbabel.org/WEB_DOC_DIR/fmt_navitel_trk.html
 file   rw----  dna     dna     Navitrak DNA marker format      xcsv
@@ -1104,18 +1074,6 @@ option   dna     prefer_shortnames       Use shortname instead of description    boolean                         htt
 
 option dna     datum   GPS datum (def. WGS 84) string                          https://www.gpsbabel.org/WEB_DOC_DIR/fmt_dna.html#fmt_dna_o_datum
 
-file   r-----  netstumbler             NetStumbler Summary File (text) netstumbler
-       https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html
-option netstumbler     nseicon Non-stealth encrypted icon name string  Red Square                      https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_nseicon
-
-option netstumbler     nsneicon        Non-stealth non-encrypted icon name     string  Green Square                    https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_nsneicon
-
-option netstumbler     seicon  Stealth encrypted icon name     string  Red Diamond                     https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_seicon
-
-option netstumbler     sneicon Stealth non-encrypted icon name string  Green Diamond                   https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_sneicon
-
-option netstumbler     snmac   Shortname is MAC address        boolean                         https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_snmac
-
 file   rw----  nima            NIMA/GNIS Geographic Names File xcsv
        https://www.gpsbabel.org/WEB_DOC_DIR/fmt_nima.html
 option nima    snlen   Max synthesized shortname length        integer         1               https://www.gpsbabel.org/WEB_DOC_DIR/fmt_nima.html#fmt_nima_o_snlen
index d509d5bf13ef7193142a29921745f0e29a6babd3..6cf3756d626d333b857277136f5b17da59facaef 100644 (file)
@@ -32,8 +32,6 @@ Options:
     -V               Print GPSBabel version and exit
 
 File Types (-i and -o options):
-       alantrl               Alan Map500 tracklogs (.trl)
-       alanwpr               Alan Map500 waypoints and routes (.wpr)
        baroiq                Brauniger IQ Series Barograph Download
        bushnell_trl          Bushnell GPS Trail file
        bushnell              Bushnell GPS Waypoint file
@@ -76,16 +74,6 @@ File Types (-i and -o options):
          urlbase               Basename prepended to URL on output 
          prefer_shortnames     (0/1) Use shortname instead of description 
          datum                 GPS datum (def. WGS 84) 
-       an1                   DeLorme .an1 (drawing) file
-         type                  Type of .an1 file 
-         road                  Road type changes 
-         nogc                  (0/1) Do not add geocache data to description 
-         nourl                 (0/1) Do not add URLs to description 
-         deficon               Symbol to use for point data 
-         color                 Color for lines or mapnotes 
-         zoom                  Zoom level to reduce points 
-         wpt_type              Waypoint type 
-         radius                Radius for circles 
        gpl                   DeLorme GPL
        saplus                DeLorme Street Atlas Plus
          snlen                 Max synthesized shortname length 
@@ -538,9 +526,6 @@ File Types (-i and -o options):
          power_off             (0/1) Command unit to power itself down 
        sbp                   NaviGPS GT-31/BGT-31 datalogger (.sbp)
        sbn                   NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)
-       naviguide             Naviguide binary route file (.twl)
-         output                'wp' - Create waypoint file , 'rte' - Create route 
-         reorder               'n' - Keep the existing wp name, 'y' - rename wayp 
        navitel_trk           Navitel binary track (.bin)
        dna                   Navitrak DNA marker format
          snlen                 Max synthesized shortname length 
@@ -550,12 +535,6 @@ File Types (-i and -o options):
          urlbase               Basename prepended to URL on output 
          prefer_shortnames     (0/1) Use shortname instead of description 
          datum                 GPS datum (def. WGS 84) 
-       netstumbler           NetStumbler Summary File (text)
-         nseicon               Non-stealth encrypted icon name 
-         nsneicon              Non-stealth non-encrypted icon name 
-         seicon                Stealth encrypted icon name 
-         sneicon               Stealth non-encrypted icon name 
-         snmac                 (0/1) Shortname is MAC address 
        nima                  NIMA/GNIS Geographic Names File
          snlen                 Max synthesized shortname length 
          snwhite               (0/1) Allow whitespace synth. shortnames 
diff --git a/reference/ics.gpx.naviguide.gpx b/reference/ics.gpx.naviguide.gpx
deleted file mode 100644 (file)
index 9bdfa16..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
-  <time>1970-01-01T00:00:00Z</time>
-  <bounds minlat="20.556257939" minlon="32.568395522" maxlat="22.556254099" maxlon="34.568387647"/>
-  <rte>
-    <rtept lat="22.556250760" lon="32.568395669">
-      <ele>0.000</ele>
-      <name>1</name>
-      <cmt>1</cmt>
-      <desc>1</desc>
-    </rtept>
-    <rtept lat="22.556254099" lon="34.568387354">
-      <ele>0.000</ele>
-      <name>2</name>
-      <cmt>2</cmt>
-      <desc>2</desc>
-    </rtept>
-    <rtept lat="20.556260799" lon="34.568387647">
-      <ele>0.000</ele>
-      <name>3</name>
-      <cmt>3</cmt>
-      <desc>3</desc>
-    </rtept>
-    <rtept lat="20.556257939" lon="32.568395522">
-      <ele>0.000</ele>
-      <name>4</name>
-      <cmt>4</cmt>
-      <desc>4</desc>
-    </rtept>
-  </rte>
-</gpx>
diff --git a/reference/route/naviguide-route.twl b/reference/route/naviguide-route.twl
deleted file mode 100644 (file)
index 2ce57d8..0000000
Binary files a/reference/route/naviguide-route.twl and /dev/null differ
diff --git a/reference/route/naviguide.gpx b/reference/route/naviguide.gpx
deleted file mode 100644 (file)
index ad44386..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
-  <time>1970-01-01T00:00:00Z</time>
-  <bounds minlat="31.079040219" minlon="35.334211349" maxlat="31.151763832" maxlon="35.373254513"/>
-  <rte>
-    <rtept lat="31.151763832" lon="35.334211349">
-      <ele>0.000</ele>
-      <name>A001</name>
-      <cmt>תחילת מסלול</cmt>
-      <desc>תחילת מסלול</desc>
-    </rtept>
-    <rtept lat="31.148399233" lon="35.334595055">
-      <ele>0.000</ele>
-      <name>A002</name>
-    </rtept>
-    <rtept lat="31.145292030" lon="35.339268116">
-      <ele>0.000</ele>
-      <name>A003</name>
-    </rtept>
-    <rtept lat="31.148122342" lon="35.349769369">
-      <ele>0.000</ele>
-      <name>A004</name>
-    </rtept>
-    <rtept lat="31.137824342" lon="35.356046003">
-      <ele>0.000</ele>
-      <name>A005</name>
-    </rtept>
-    <rtept lat="31.140849812" lon="35.360496718">
-      <ele>0.000</ele>
-      <name>A006</name>
-    </rtept>
-    <rtept lat="31.143549991" lon="35.365314221">
-      <ele>0.000</ele>
-      <name>A007</name>
-      <cmt>כניסה לשטח</cmt>
-      <desc>כניסה לשטח</desc>
-    </rtept>
-    <rtept lat="31.136830461" lon="35.365376817">
-      <ele>0.000</ele>
-      <name>A008</name>
-    </rtept>
-    <rtept lat="31.135110014" lon="35.363465678">
-      <ele>0.000</ele>
-      <name>A009</name>
-    </rtept>
-    <rtept lat="31.126141859" lon="35.373254513">
-      <ele>0.000</ele>
-      <name>A010</name>
-    </rtept>
-    <rtept lat="31.120207182" lon="35.373171096">
-      <ele>0.000</ele>
-      <name>A011</name>
-    </rtept>
-    <rtept lat="31.116197897" lon="35.369641876">
-      <ele>0.000</ele>
-      <name>A012</name>
-    </rtept>
-    <rtept lat="31.105586290" lon="35.366102295">
-      <ele>0.000</ele>
-      <name>A013</name>
-    </rtept>
-    <rtept lat="31.101037072" lon="35.361336210">
-      <ele>0.000</ele>
-      <name>A014</name>
-    </rtept>
-    <rtept lat="31.095571639" lon="35.361023710">
-      <ele>0.000</ele>
-      <name>A015</name>
-      <cmt>צומת עם שביל ירוק</cmt>
-      <desc>צומת עם שביל ירוק</desc>
-    </rtept>
-    <rtept lat="31.092793957" lon="35.368376974">
-      <ele>0.000</ele>
-      <name>A016</name>
-    </rtept>
-    <rtept lat="31.080005110" lon="35.367737755">
-      <ele>0.000</ele>
-      <name>A017</name>
-    </rtept>
-    <rtept lat="31.079040219" lon="35.351817976">
-      <ele>0.000</ele>
-      <name>A018</name>
-    </rtept>
-    <rtept lat="31.083843816" lon="35.355272899">
-      <ele>0.000</ele>
-      <name>A019</name>
-      <cmt>מערה</cmt>
-      <desc>מערה</desc>
-    </rtept>
-  </rte>
-</gpx>
diff --git a/testo.d/alantrl.test b/testo.d/alantrl.test
deleted file mode 100644 (file)
index 8c655eb..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Alan Map500 tracklogs< test
-#
-rm -f ${TMPDIR}/alantrl*
-gpsbabel -i alantrl -f ${REFERENCE}/alantrl.trl -o alantrl -F ${TMPDIR}/alantrl-new.trl
-gpsbabel -i alantrl -f ${TMPDIR}/alantrl-new.trl -o gpx -F ${TMPDIR}/alantrl-new.gpx
-compare ${REFERENCE}/alantrl.gpx ${TMPDIR}/alantrl-new.gpx 
-
diff --git a/testo.d/alanwpr.test b/testo.d/alanwpr.test
deleted file mode 100644 (file)
index ccb364f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Alan MAp500 waypoint & route test
-#
-rm -f ${TMPDIR}/alanwpr*
-gpsbabel -i alanwpr -f ${REFERENCE}/alanwpr.wpr -o alanwpr -F ${TMPDIR}/alanwpr-new.wpr
-gpsbabel -i alanwpr -f ${TMPDIR}/alanwpr-new.wpr -o gpx -F ${TMPDIR}/alanwpr-new.gpx
-compare ${REFERENCE}/alanwpr.gpx ${TMPDIR}/alanwpr-new.gpx 
-
diff --git a/testo.d/an1.test b/testo.d/an1.test
deleted file mode 100644 (file)
index 56a2e16..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-
-#
-# DeLorme .an1 tests
-#
-rm -f ${TMPDIR}/an1.out
-gpsbabel -i an1 -f ${REFERENCE}/foo.an1 -o csv -F ${TMPDIR}/an1.out
-compare ${REFERENCE}/an1-in.ref ${TMPDIR}/an1.out
-
-rm -f ${TMPDIR}/an1.out
-gpsbabel -i an1 -f ${REFERENCE}/foo.an1 -o an1 -F ${TMPDIR}/an1.out
-bincompare ${TMPDIR}/an1.out ${REFERENCE}/an1-an1.ref
-
-rm -f ${TMPDIR}/an1.out
-gpsbabel -i xmap -f ${REFERENCE}/xmap -o an1 -F ${TMPDIR}/an1.out
-bincompare ${TMPDIR}/an1.out ${REFERENCE}/an1-out.ref
-
-#rm -f ${TMPDIR}/an1.out
-#gpsbabel -i gpx -f ${REFERENCE}/an1-in.gpx -o an1 -F ${TMPDIR}/an1.out
-#bincompare ${TMPDIR}/an1.out ${REFERENCE}/an1-line-out.ref
-
diff --git a/testo.d/naviguide.test b/testo.d/naviguide.test
deleted file mode 100644 (file)
index da5be62..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# Naivguide 
-#
-gpsbabel -i naviguide -f ${REFERENCE}/route/naviguide-route.twl -o gpx -F ${TMPDIR}/naviguide.gpx
-compare ${REFERENCE}/route/naviguide.gpx ${TMPDIR}/naviguide.gpx
-# Make sure ICS negative eastings and northings work.
-gpsbabel -i gpx -f ${REFERENCE}/ics.gpx -o naviguide -F ${TMPDIR}/ics.gpx.naviguide
-gpsbabel -i naviguide -f ${TMPDIR}/ics.gpx.naviguide -o gpx -F ${TMPDIR}/ics.gpx.naviguide.gpx
-compare ${REFERENCE}/ics.gpx.naviguide.gpx ${TMPDIR}/ics.gpx.naviguide.gpx
diff --git a/testo.d/netstumbler.test b/testo.d/netstumbler.test
deleted file mode 100644 (file)
index 7989a72..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#
-# NetStumbler Summary File (read-only)
-#
-rm -f ${TMPDIR}/netstumbler.gpx
-gpsbabel -i netstumbler -f ${REFERENCE}/netstumbler.txt -o gpx -F ${TMPDIR}/netstumbler.gpx
-compare ${TMPDIR}/netstumbler.gpx ${REFERENCE}/netstumbler.gpx
-
diff --git a/vecs.h b/vecs.h
index 81659ca7bae203a3ea4028514f27c0b57581fc41..627c3b6ab4d1a258777a7ab0375c933fd8deacde 100644 (file)
--- a/vecs.h
+++ b/vecs.h
@@ -74,7 +74,6 @@ extern ff_vecs_t navicache_vecs;
 extern ff_vecs_t gpl_vecs;
 extern ff_vecs_t text_vecs;
 extern ff_vecs_t html_vecs;
-extern ff_vecs_t netstumbler_vecs;
 extern ff_vecs_t igc_vecs;
 extern ff_vecs_t brauniger_iq_vecs;
 extern ff_vecs_t mtk_vecs;
@@ -93,7 +92,6 @@ extern ff_vecs_t glogbook_vecs;
 extern ff_vecs_t vcf_vecs;
 extern ff_vecs_t google_dir_vecs;
 extern ff_vecs_t maggeo_vecs;
-extern ff_vecs_t an1_vecs;
 extern ff_vecs_t tomtom_vecs;
 extern ff_vecs_t tef_xml_vecs;
 extern ff_vecs_t vitosmt_vecs;
@@ -120,8 +118,6 @@ extern ff_vecs_t garmin_txt_vecs;
 extern ff_vecs_t gtc_vecs;
 extern ff_vecs_t dmtlog_vecs;
 extern ff_vecs_t raymarine_vecs;
-extern ff_vecs_t alanwpr_vecs;
-extern ff_vecs_t alantrl_vecs;
 extern ff_vecs_t vitovtt_vecs;
 extern ff_vecs_t ggv_log_vecs;
 #if CSVFMTS_ENABLED
@@ -160,7 +156,6 @@ extern ff_vecs_t pocketfms_bc_vecs;
 extern ff_vecs_t pocketfms_fp_vecs;
 extern ff_vecs_t pocketfms_wp_vecs;
 extern ff_vecs_t v900_vecs;
-extern ff_vecs_t ng_vecs;
 extern ff_vecs_t enigma_vecs;
 extern ff_vecs_t skytraq_vecs;
 extern ff_vecs_t teletype_vecs;
@@ -295,7 +290,6 @@ private:
   LegacyFormat gpl_fmt {gpl_vecs};
   LegacyFormat text_fmt {text_vecs};
   LegacyFormat html_fmt {html_vecs};
-  LegacyFormat netstumbler_fmt {netstumbler_vecs};
   LegacyFormat igc_fmt {igc_vecs};
   LegacyFormat brauniger_iq_fmt {brauniger_iq_vecs};
   LegacyFormat mtk_fmt {mtk_vecs};
@@ -314,7 +308,6 @@ private:
   LegacyFormat vcf_fmt {vcf_vecs};
   LegacyFormat google_dir_fmt {google_dir_vecs};
   LegacyFormat maggeo_fmt {maggeo_vecs};
-  LegacyFormat an1_fmt {an1_vecs};
   LegacyFormat tomtom_fmt {tomtom_vecs};
   LegacyFormat tef_xml_fmt {tef_xml_vecs};
   LegacyFormat vitosmt_fmt {vitosmt_vecs};
@@ -342,8 +335,6 @@ private:
   LegacyFormat gtc_fmt {gtc_vecs};
   LegacyFormat dmtlog_fmt {dmtlog_vecs};
   LegacyFormat raymarine_fmt {raymarine_vecs};
-  LegacyFormat alanwpr_fmt {alanwpr_vecs};
-  LegacyFormat alantrl_fmt {alantrl_vecs};
   LegacyFormat vitovtt_fmt {vitovtt_vecs};
   LegacyFormat ggv_log_fmt {ggv_log_vecs};
 #if CSVFMTS_ENABLED
@@ -388,7 +379,6 @@ private:
   LegacyFormat pocketfms_fp_fmt {pocketfms_fp_vecs};
   LegacyFormat pocketfms_wp_fmt {pocketfms_wp_vecs};
   LegacyFormat v900_fmt {v900_vecs};
-  LegacyFormat ng_fmt {ng_vecs};
   LegacyFormat enigma_fmt {enigma_vecs};
   LegacyFormat skytraq_fmt {skytraq_vecs};
   LegacyFormat teletype_fmt {teletype_vecs};
@@ -613,13 +603,6 @@ private:
       "html",
       nullptr,
     },
-    {
-      &netstumbler_fmt,
-      "netstumbler",
-      "NetStumbler Summary File (text)",
-      nullptr,
-      nullptr,
-    },
     {
       &igc_fmt,
       "igc",
@@ -734,13 +717,6 @@ private:
       "gs",
       nullptr,
     },
-    {
-      &an1_fmt,
-      "an1",
-      "DeLorme .an1 (drawing) file",
-      "an1",
-      nullptr,
-    },
     {
       &tomtom_fmt,
       "tomtom",
@@ -882,20 +858,6 @@ private:
       "rwf",
       nullptr,
     },
-    {
-      &alanwpr_fmt,
-      "alanwpr",
-      "Alan Map500 waypoints and routes (.wpr)",
-      "wpr",
-      nullptr,
-    },
-    {
-      &alantrl_fmt,
-      "alantrl",
-      "Alan Map500 tracklogs (.trl)",
-      "trl",
-      nullptr,
-    },
     {
       &vitovtt_fmt,
       "vitovtt",
@@ -1180,13 +1142,6 @@ private:
       nullptr,
       nullptr,
     },
-    {
-      &ng_fmt,
-      "naviguide",
-      "Naviguide binary route file (.twl)",
-      "twl",
-      nullptr,
-    },
     {
       &enigma_fmt,
       "enigma",
diff --git a/xmldoc/formats/alantrl.xml b/xmldoc/formats/alantrl.xml
deleted file mode 100644 (file)
index 19fff93..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<para>
-GPSBabel supports .wpr and .trl files for Alan Map500 devices running operating 
-system versions 2.xx.
-</para>
-
-<para>
-.trl contain files tracklogs. If you use a CF-Card based
-operating system, tracklog files must have a <filename>.TRL</filename> extension when
-copied to the CF-Card. The default filename is <filename>TEMP_TRK.TRL</filename>.
-Only one <filename>.TRL</filename> file may be present.
-</para>
-
-<para>
-Alan's operating system 3.0 for Map500 is not supported yet.
-At the time of this writing, OS3 is still beta.
-Documentation on the new dataformats is sparse.
-</para>
-
-<para>
-The Alan Map500 handheld GPSr is identical to the Holux GM101.
-This GPSBabel module has only been tested against the Alan Map500.
-Still, if you use a GM101, GPSBabel will probably be able to convert
-your waypoints, routes and tracklogs.
-</para>
-
-<para>
-For more information on the Alan Map500 visit
-<ulink url="http://www.alan-electronics.de/gps/gpsuebersicht.php3">Alan Germany</ulink>. There is very informative <ulink url="http://www.alan-germany.de/forum/index.php">forum</ulink>, too. The forum language is German but posts in English will be answered, too.
-</para>
diff --git a/xmldoc/formats/alanwpr.xml b/xmldoc/formats/alanwpr.xml
deleted file mode 100644 (file)
index 645925b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<para>
-GPSBabel supports .wpr and .trl files for Alan Map500 devices running operating 
-system versions 2.xx.
-</para>
-
-<para>
-.wpr files contain waypoints and routes. If you use a CF-Card based
-operating system, waypoint files must have a <filename>.WPR</filename> extension when
-copied to the CF-Card. The default filename is <filename>TEMPWPRT.WPR</filename>.
-Only one <filename>.WPR</filename> file may be present.
-</para>
-
-<para>
-Alan's operating system 3.0 for Map500 is not supported yet.
-At the time of this writing, OS3 is still beta.
-Documentation on the new dataformats is sparse.
-</para>
-
-<para>
-The Alan Map500 handheld GPSr is identical to the Holux GM101.
-This GPSBabel module has only been tested against the Alan Map500.
-Still, if you use a GM101, GPSBabel will probably be able to convert
-your waypoints, routes and tracklogs.
-</para>
-
-<para>
-For more information on the Alan Map500 visit
-<ulink url="http://www.alan-electronics.de/gps/gpsuebersicht.php3">Alan Germany</ulink>. There is very informative <ulink url="http://www.alan-germany.de/forum/index.php">forum</ulink>, too. Forum language is German but posts in English will be answered,
-too.
-</para>
diff --git a/xmldoc/formats/an1.xml b/xmldoc/formats/an1.xml
deleted file mode 100644 (file)
index 7094159..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<para> 
-This format supports the <ulink url="http://www.delorme.com">DeLorme</ulink> ".an1" drawing file format used by their desktop software like Topo USA.  It can 
-currently be used to either read or write drawing files.  If you use 
-this format to create drawing files with routes or waypoints from another 
-source, by default it will create "Red Flag" symbols for waypoints, and 
-thick red lines for routes or tracks.  It is possible to merge two drawing 
-layers by doing something like this:
-</para>
-
-<para><userinput>gpsbabel -i an1 -f one.an1 -f two.an1 -o an1 -F merged.an1</userinput></para>
-
-<para> 
-In this case, the merged data will contain all of the
-properties of the original data.
-</para>
-
-<para>
-GPSBabel has a page describing <ulink url="/formats/delorme-new-interstate/">creating routable onramps in Street Atlas with GPSBabel</ulink>.
-</para>
diff --git a/xmldoc/formats/naviguide.xml b/xmldoc/formats/naviguide.xml
deleted file mode 100644 (file)
index 79caa8c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<para>Naviguide 3.02 is off-road navigation software. Naviguide covers the area of Israel and uses the Israeli old grid as a reference; Naviguide uses Hebrew as its default language.</para>
-
-<para>Naviguide uses unique map file format and binary file format (.twl) as route file.
-The *.twl file contains a route that is comprised of a list of waypoints. Naviguide does not support a file that contains only waypoints.</para>
-
-<para>GPSBabel supports reading and creating Naviguide route files. Plot files are not supported.</para>
-
diff --git a/xmldoc/formats/options/an1-color.xml b/xmldoc/formats/options/an1-color.xml
deleted file mode 100644 (file)
index eb6e9d6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
- <para>This option allows you to specify the color for
-line or mapnote data.  It accepts color names of the form "#FF0000" (red) or any
-of the color names from the Cascading Style Sheets (CSS)
-specification.</para>
diff --git a/xmldoc/formats/options/an1-deficon.xml b/xmldoc/formats/options/an1-deficon.xml
deleted file mode 100644 (file)
index 0423831..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<para>
-This option allows you to specify which symbol to use for points that 
-don't have a symbol already.  It defaults to "Red Flag" but it accepts 
-any symbol name you can put in a DeLorme export file.  To find the name 
-of a specific symbol in Street Atlas, let the mouse pointer hover over 
-it for a few seconds and the name will be displayed.
-</para>
diff --git a/xmldoc/formats/options/an1-nogc.xml b/xmldoc/formats/options/an1-nogc.xml
deleted file mode 100644 (file)
index 2dfa4c5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<para>
-If your original data contains geocaching-specific information such as 
-difficulty and terrain, GPSBabel will automatically include that information 
-in the waypoint descriptions in the generated drawing file.  If you do not 
-want that, specify the "nogc" option on the command line:
-</para>
-<para><userinput>gpsbabel -i gpx -f 12345.gpx -o an1,nogc -F 12345.an1</userinput></para>
-
diff --git a/xmldoc/formats/options/an1-nourl.xml b/xmldoc/formats/options/an1-nourl.xml
deleted file mode 100644 (file)
index e4504df..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<para>
-If your original waypoint data contains URLs, GPSBabel will include them as
-links in the generated drawing file.  This causes the waypoint symbol to have
-a blue border, and it causes the waypoint text to be drawn in blue with an 
-underline.
-</para>
-<para>
-If you do not want this behavior, specify the "nourl" option on the command
-line:
-</para>
-<para><userinput>gpsbabel -i gpx -f 12345.gpx -o an1,nourl -F 12345.an1</userinput></para>
-
diff --git a/xmldoc/formats/options/an1-radius.xml b/xmldoc/formats/options/an1-radius.xml
deleted file mode 100644 (file)
index f919776..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<para>
-If the waypoint type is "circle", the "radius" option specifies
-the radius of the circles.  By default, this is in miles, but it may be
-specified in kilometers by adding a 'k'.  The default radius is 1/10 mile.
-</para>
diff --git a/xmldoc/formats/options/an1-road.xml b/xmldoc/formats/options/an1-road.xml
deleted file mode 100644 (file)
index 351fd23..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<para>
-If you are creating a road layer, you may use the "road" option, which 
-allows you to change the types of roads based on their names.  You can 
-change multiple roads at the same time.  Currently supported types are 
-</para>
-<para>
-<segmentedlist>
-<?dbhtml list-presentation="table"?>
-<segtitle>Type</segtitle>
-<segtitle>Meaning</segtitle>
-<seglistitem>
-               <seg>limited</seg>
-              <seg>Limited-access freeways</seg>
-        </seglistitem>
-        <seglistitem>
-               <seg>toll</seg>
-               <seg>Limited-access toll highways</seg>
-        </seglistitem>
-        <seglistitem>
-               <seg>ramp</seg>      
-               <seg>Access ramps for limited-access highways</seg>
-        </seglistitem>
-        <seglistitem>
-               <seg>us</seg> 
-               <seg>National highways (e.g. US routes)</seg>
-        </seglistitem>
-        <seglistitem>
-               <seg>primary</seg> 
-               <seg>Primary State/Provincial routes</seg>
-        </seglistitem>
-        <seglistitem>
-               <seg>state</seg>
-               <seg>State/Provincial routes</seg>
-        </seglistitem>
-        <seglistitem>
-               <seg>major</seg>     
-               <seg>Major Connectors</seg>
-        </seglistitem>
-        <seglistitem>
-               <seg>ferry</seg>     
-               <seg>Ferry Routes</seg>
-        </seglistitem>
-        <seglistitem>
-               <seg>local</seg>     
-               <seg>Local Roads</seg>
-        </seglistitem>
-        <seglistitem>
-               <seg>editable</seg>
-               <seg>User-drawn Roads</seg>
-        </seglistitem>
-      </segmentedlist>
-</para>
-<para>
-GPSBabel defaults to creating editable roads.  These are routed just like 
-local roads, but may be edited with the drawing tools in Street Atlas.
-</para>
-
-<para> 
-This option has a special format that is best demonstrated by example:
-</para>
-
-<screen format="linespecific"> "road=I-599!limited!Beecher St.!major" </screen>
-
-<para>
-This option will cause any road named "I-599" to become a limited-access 
-highway and any road named "Beecher St." to become a major connector.  Note 
-that roads that have had their types changed in this way are not editable 
-in Street Atlas, so make sure they are where you want them before you 
-change them, and make sure to keep a backup of your original road layer.  
-Note that the ! is a shell metacharacter in bash and possibly other shells, 
-so you may have to use single quotes or some other escape mechanism.
-</para>
-
-<para>
-There is a tutorial on 
-<ulink url="https://www.gpsbabel.org/formats/delorme-new-interstate/">how 
-to create an onramp for a limited access highway in Street Atlas USA 
-using GPSBabel.</ulink>
-</para>
diff --git a/xmldoc/formats/options/an1-type.xml b/xmldoc/formats/options/an1-type.xml
deleted file mode 100644 (file)
index aa21357..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<para> This option specifies the type of the drawing layer
-to be created.  The supported values are "drawing", "road", "trail",
-"waypoint", or "track".  If you do not specify a type, the default
-will be either the type of the previous an1 file or "drawing" if there
-is no previous file. This lets you merge, for example, two road layers
-without having to specify "type=road" for the output.  </para>
-
diff --git a/xmldoc/formats/options/an1-wpt_type.xml b/xmldoc/formats/options/an1-wpt_type.xml
deleted file mode 100644 (file)
index dbea684..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<para>
-This option specifies how to represent point data in the draw file.  
-Valid waypoint types are "symbol", "text", "mapnote", "circle", and "image".  
-The default is "symbol". 
-</para>
-<para>
-If you specify a waypoint type of "image", you should make sure that the
-icon descriptions of your waypoints are the full names, including drive letters
-and full path, of image files in a format that works with your DeLorme 
-product.  Note that this means that the .an1 file you generate will not work
-on any computer that does not have those images in the same place; this is 
-part of the design of the an1 format and cannot be avoided.
-</para>
diff --git a/xmldoc/formats/options/an1-zoom.xml b/xmldoc/formats/options/an1-zoom.xml
deleted file mode 100644 (file)
index ddfe572..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<para>
-This option specifies at what zoom level Street Atlas will begin showing 
-reduced versions of your symbols. The default is 10.  Setting zoom to 0 will 
-disable this feature.  Setting it to anything but the default will override 
-the zoom level specified on any waypoints that were read from an existing 
-an1 file; this is by design.
-</para>
diff --git a/xmldoc/formats/options/naviguide-reorder.xml b/xmldoc/formats/options/naviguide-reorder.xml
deleted file mode 100644 (file)
index 8b13789..0000000
+++ /dev/null
@@ -1 +0,0 @@
-